参照によって戻ると、連鎖操作を実行する時間が短縮されます。例):
a = b = c = d;
operator=
値によって返される場合に呼び出されるアクションを見てみましょう。
- コピー代入 operator= for
c
は、一時的な無名オブジェクトを作成し、コピー ctor を呼び出しますc
。と呼びましょう。d
tc
- 次に、operator= for
b
が呼び出されます。右側のオブジェクトは tc です。移動代入演算子が呼び出されます。b
と等しくなりtc
ます。そして、関数b
は一時的な匿名にコピーします。それを と呼びましょうtb
。
- 同じことが再び起こり、
a.operator=
の一時コピーを返しますa
。オペレーターの後;
、3 つの一時オブジェクトはすべて破棄されます
全部で: コピー オペレーター 3 人、ムーブ オペレーター 2 人、コピー オペレーター 1 人
operator= が参照によって値を返す場合、何が変わるか見てみましょう。
- コピー代入演算子が呼び出されます。
c
と等しくなりd
、左辺値オブジェクトへの参照が返されます
- 同じ。
b
と等しくなりc
、左辺値オブジェクトへの参照が返されます
- 同じ。
a
と等しくなりb
、左辺値オブジェクトへの参照が返されます
全体として、3 つのコピー オペレータのみが呼び出され、ctor はまったく呼び出されません。
さらに、const 参照によって値を返すことをお勧めします。これでは、トリッキーで自明でないコードを記述できなくなります。よりクリーンなコードを使用すると、バグを見つけるのがはるかに簡単になります:) ( a = b ).f();
2行に分割することをお勧めしますa=b; a.f();
。
PS : コピー代入演算子: operator=(const Class& rhs)
.
移動代入演算子: operator=(Class&& rhs)
.