はI、次のコードを見たことがありますか?C++、同一のメソッドシグネチャが異なる戻り値の型
答えて
2つの機能は実際には同じではありません。 2番目の関数だけがメンバー関数const
として宣言されています。メンバーが呼び出されたオブジェクトがconst
の場合、後者のオプションが使用されます。オブジェクトがconst
でない場合、最初のオプションが使用されます。
例:
void any_func(const Type *t)
{
something = t->value(); //second `const` version used
}
void any_func2(Type *t)
{
something = t->value(); //first non-`const` version used
}
const
宣言された両方の機能をconst
または両方の非宣言された場合、コンパイラは、は(べき、とにかく)文句であろう。
異なる機能の署名のため
const
カウントするので、なぜコンパイラはおよそ
を文句はありません。あなたの仮定は、ファンクションシグネチャが同じですが間違っています。
const
とマークされた機能は、const
インスタンスまたは参照のいずれかがType<T>
の場合に呼び出されます。
どのように呼び出されているかを知るには?
機能でcout
文を入れて、以下の例をテスト:
template <class T>
class Type {
public:
Type() {}
T& operator=(const T& rhs) {value() = rhs; return value();}
T& value() {
std::cout << "non const version" << std endl;
return m_value;
}
T value() const {
std::cout << "const version" << std endl;
return m_value;
}
private:
T m_value;
};
int main() {
Type<int> t;
t.value();
Type<int> rt = t;
rt.value();
Type<int>* pt = &t;
pt->value();
const Type<int> ct;
ct.value();
const Type<int>& crt = t;
crt.value();
const Type<int>* pct = &t;
pct->value();
}
あなたの代入演算子は、非constのバージョンを呼び出します。
あなたは常にRVO(戻り値の最適化)に頼ることはできない、と余分なコピーは(特に古いコンパイラの実装のために)取られる可能性があるため、constのバージョンは、より良い
const T& value() const {
std::cout << "const version" << std endl;
return m_value;
}
のようになります。
も代入演算子は、現在のインスタンスへの参照を返す必要があり注意:機能解像度優先に単語の
Type& operator=(const T& rhs) {value() = rhs; return *this;}
カップル。コンパイラは、const/non const関数を次のように区別します。
クラスに与えられた名前と引数リストを持つconst関数のみがあれば、それは定数オブジェクトと非定数オブジェクトの両方で呼び出されます。この関数を呼び出した後、オブジェクトは(constでなくても)constを仮定します。つまり、その関数は他のconst関数だけを呼び出すことができます。
クラスに非const関数のみがある場合、非constオブジェクトに対して呼び出されます。 constオブジェクトに対してこの関数を呼び出そうとすると、コンパイルエラーが発生します。
クラスに両方の関数を使用できる場合、constバージョンはconstオブジェクトに使用され、非constバージョンは非constオブジェクトに使用されます。
説明の初期ミックスアップに私の注意を向けるために@owacoderに感謝します。
- 1. は異なる戻り値の型
- 2. VS2015 C++コルーチン:promise.get_return_object()戻り値の型とコルーチン戻り値の型
- 3. C++ Iterators戻り値の型
- 4. 関数の戻り値の型が異なります。
- 5. ASP.NET Web APIの戻り値の型が異なります。
- 6. 異なる戻り値の型を持つ列挙型Func
- 7. collect vs collectFirst - 戻り値が異なる型の理由 - Scala
- 8. C#の - 一貫性のないアクセシビリティ:戻り値の型の一覧は
- 9. 同じパラメータと異なる戻り値の型を持つSpring RESTful GETメソッド
- 10. ジェネリッククラスのメソッドとは異なる戻り値の型
- 11. C#ジェネリックメソッドの戻り値の型タイプ
- 12. C#の戻り値の型エラー
- 13. C#の:ブール戻り値の型
- 14. C++でのラムダ戻り値の型
- 15. 空の戻り値の型C++
- 16. RxJava 2で異なる戻り値の型(RxJava1から更新)
- 17. デフォルトのCのboolean型の戻り関数の戻り値++
- 18. クリスタルCバインディング:戻り値の型はchar *
- 19. 異なる戻り値
- 20. Cのsizeofの戻り値の型がコンテキストによって異なるのはなぜですか?
- 21. decltype(オート) - 戻り値の型の推論戻り値の型
- 22. C# - 関数の戻り値の型はパラメータの値と同じです
- 23. C#のサブクラスに依存する動的な戻り値の型?
- 24. 戻り値の型
- 25. 戻り値の型
- 26. 戻り値の型=
- 27. 戻り値の型
- 28. 異なる汎用パラメータを持つC#汎用戻り型
- 29. actionscriptのジェネリック(戻り値の型はパラメータ型と同じ)
- 30. 一般的な戻り値の型とラムダ関数の引数
2つの機能シグネチャが「同一」であるかどうかを判断する際に、キーワードを無視しないでください。 –