web-dev-qa-db-ja.com

代入演算子の戻り型とは何ですか?

C++を始めたばかりです。代入と逆参照演算子の戻り値の型について少し混乱しています。私はC++ Primerという本をフォローしています。作者は、さまざまな場面で、代入演算子の戻りの型は左側のオペランドの型を参照していると述べていますが、後で戻り型は左側のオペランドの型であると述べています。 C++ 11 Standard Secを紹介しました。 5.17。戻り値の型は「左辺のオペランドを参照する左辺値」と記述されています。

同様に、逆参照がポイントされたオブジェクトを返すのか、オブジェクトへの参照を返すのかわかりません。

これらのステートメントは同等ですか?もしそうなら、どのように?説明をいただければ幸いです。

28
oczkoisse

この規格では、代入演算子の戻り値の型が正しく定義されています。実際、代入演算自体は戻り値に依存していません。そのため、戻り値の型を理解するのは簡単ではありません。

戻り値の型は、操作の連鎖にとって重要です。次の構成を検討してください:_a = b = c;_。これはa = (b = c)と等しい必要があります。つまり、cbに、baに割り当てる必要があります。これをa.operator=(b.operator=(c))に書き換えます。 aへの割り当てが正しく機能するためには、b.operator=(c)の戻り値の型が内部の割り当て結果を参照している必要があります(コピーでも機能しますが、これは不必要なオーバーヘッドです)。

間接参照演算子の戻り値の型は内部ロジックによって異なりますが、ニーズに合った方法で定義してください。

27

どちらも何でもかまいませんが、通常operator =は、現在のオブジェクトを参照で返します。

A& A::operator = ( ... )
{
   return *this;
}

そして、はい、「左側のオペランドの型への参照」と「左側のオペランドを参照する左辺値」は同じことを意味します。

間接参照演算子は、基本的に任意の戻り型を持つことができます。オブジェクトへのポインタではなく、オブジェクトに適用される演算子をオーバーロードしているため、これは主にプログラムのロジックに依存します。通常、これはスマートポインタまたはイテレータに使用され、ラップするオブジェクトを返します。

struct smart_ptr
{
   T* innerPtr;
   T* smart_ptr::operator* ()
   {
      return innerPtr;
   }
}

smart_ptr p; 
T* x = *p;  
9
Luchian Grigore

私は同様の問題を見てきましたが、使用するのが最善だと思います

X& X::operator=(const X&);

これを使用すると、チェーン割り当てでオブジェクトを再利用できます。

1
bash.d