2017-04-19 4 views
0

、代入演算子は、以下のいずれかの形式を有することができる。代入演算子はいつconst T&、T&or Tを返すべきですか?この<a href="http://www.cplusplus.com/articles/y8hv0pDG/" rel="nofollow noreferrer">article</a>によれば

(1) MyClass& operator=(const MyClass& rhs); 
(2) MyClass& operator=(MyClass& rhs); 
(3) MyClass& operator=(MyClass rhs); 
(4) const MyClass& operator=(const MyClass& rhs); 
(5) const MyClass& operator=(MyClass& rhs); 
(6) const MyClass& operator=(MyClass rhs); 
(7) MyClass operator=(const MyClass& rhs); 
(8) MyClass operator=(MyClass& rhs); 
(9) MyClass operator=(MyClass rhs); 
  • 形態(2)、(5)及び(8)推奨されている代入演算子は変更しないでくださいために、そのパラメータ。これが必要なケースは考えられません。
  • (3)、(6)、(9)の形式は、コピースワップイディオムに役立ちます。
  • 私は、(7) - (9)はconstオブジェクト(構築後に変更されない)に対してのみ使用されるべきだと考えます。あれは正しいですか?

私の質問は:私はこれを使用する必要があるときはタイプMyClassMyClass &またはconst MyClass &を返しますか?

+0

(2)、(5)、(8)は、「移動意味」のようなものを実装するために必要です。 – Scheff

+2

[この正規の代入演算子のリファレンス](http://en.cppreference.com/w/cpp/language/operators#Assignment_operator)から: "標準的なコピー代入演算子は、参照によってlhsを返すことが期待されています" 。また、* copy *代入演算子はrhsを変更すべきではないので、好ましくは定数への参照であるべきです。値渡しは時には便利です(以前にリンクされた参照に見られるように)。 –

+2

@Scheffいいえ、あなたは 'operator =(MyClass &&)'を考えています。質問には 'operator =(MyClass&)'があります。 – hvd

答えて

1

実際には古いものではありませんが、間違っています。代入演算子(メンバoperator=)は、クラス型自体だけでなく、複数の型に対してオーバーロードすることができ、戻り型はまったく制限されません。

スタイルの問題として、非constリファレンスをオブジェクトに戻すことは組み込み型との一貫性のために一般的ですが、私は個人的にはvoidを好んでいます。これにより、代入式をサブ式として使用することはほとんど不可能になります(a=b && c=dなど)。私はこれを利点と考えています。

C++ 11では移動操作が追加されていますので、void MyClass::operator=(MyClass&&)があなたにとって有益かどうか検討する必要があります。

関連する問題