18

代入演算子を定義するときは、常に次のようになります。

class X {...};

X& X::operator=(...whatever...);

つまり、戻り値の型は「X への参照」です。ここで、パラメーター ( ...whatever...) はX&コピー アンド スワップ イディオムを使用する場合const X&のみ、またはその他の型にすることができます。X

パラメータに関係なく、への非 const 参照を返すXことを誰もが推奨しているのは奇妙に思えます。(a = b).clear()これは、良いと思われるのような表現を明示的に許可します。

私は別の意見を持っており、私のコードでも(x=y).clear、 、 のような表現を禁止したいと考えています。私の考えでは、これらの式は 1 行のコードで複雑すぎることを行います。そこで、代入演算子を返すことにしました。(x=y)=zx=y=zvoid

void X::operator=(X) {...}
void X::operator=(int) {...}

これにはどのような悪影響がありますか? (見た目がいつもと違う以外は)

クラス X を標準コンテナ (例: std::vector<X>) で使用できますか?

私は C++03 を使用しています (問題がある場合)。

4

1 に答える 1

27

あなたのクラスはCopyAssignableの概念 (§17.6.3.1)を満たしていないため、これを必要とする標準コンテナーで動作することが標準によって保証されなくなりました (たとえば、操作std::vectorにはこれが必要ですinsert)。

それに加えて、この動作は慣用的なものではなく、コードを使用するプログラマーによって驚くべきものとして認識されます。連鎖を禁止したい場合は、代入を行う名前付き関数を追加することを検討してください。

このような微妙な方法で慣用的な演算子の動作を変更しようとしないでください。コードの読み取りと保守が難しくなります。

于 2013-09-30T08:54:12.003 に答える