3

以下では :

template<typename Derived>
class Base:
{
    inline Derived& operator=(const Base<Derived>& x);
}

この宣言はデフォルトのコピー代入演算子を消去しますか、それとも2つの演算子がありますか?

inline Derived& operator=(const Base<Derived>& x); 
// (declared by me)

inline Base<Derived>& operator=(const Base<Derived>& x); 
// (declared by the compiler)

この場合、関数を呼び出すと、コンパイラはどのようにして適切な演算子を取得しますか?

4

2 に答える 2

3

代入演算子に渡すことができるメソッドを宣言する場合

XXX Foo::operator=(Foo&);
XXX Foo::operator=(Foo const&);
XXX Foo::operator=(Foo volatile&);
XXX Foo::operator=(Foo const volatile&);

その場合、コンパイラはデフォルトバージョンを生成しませんFoo& operator=(Foo const&);

他のメソッドと同様に、returnタイプは完全に無料であることに注意してください。void、、、bool本当に何でも使用できます。代入連鎖を可能にするためにselfへの参照を返すのは慣用的です(必須ではありません)。これ自体は、オーバーロードされた演算子が組み込みの対応する演算子のセマンティクスに従う必要があるというガイドラインに基づいています。a = b = c = 0;

于 2012-12-09T14:04:29.377 に答える
1

やってみました?リターンタイプのみによるオーバーロードはコンパイルエラーになるので、定義されたものがデフォルトのものを置き換えると思います。

于 2012-12-09T09:07:10.803 に答える