をオーバーロードするoperator=
と、任意の型を返すように記述できます。どうしてもやりたい場合は、オーバーロードX::operator=
して(たとえば)まったく異なるクラスのインスタンスを返すことができますY
またはZ
. ただし、これは一般的に非常にお勧めできません。
operator=
特に、通常はC と同じように の連鎖をサポートする必要があります。例えば:
int x, y, z;
x = y = z = 0;
その場合、通常、割り当てられている型の左辺値または右辺値を返したいと思うでしょう。X への参照、X への const 参照、または X (値による) のいずれを返すかという問題だけが残ります。
X への const 参照を返すことは、一般的にはお勧めできません。特に、const 参照は一時オブジェクトにバインドできます。一時オブジェクトの存続期間は、それがバインドされている参照の存続期間まで延長されますが、割り当てられているものの存続期間まで再帰的に延長されることはありません。これにより、ダングリング参照を簡単に返すことができます。const 参照は一時オブジェクトにバインドされます。そのオブジェクトの有効期間は、参照の有効期間 (関数の最後で終了) まで延長されます。関数が戻るまでに、参照と一時の有効期間が終了しているため、割り当てられているのはダングリング参照です。
もちろん、const 以外の参照を返すことで、これに対する完全な保護が提供されるわけではありませんが、少なくとも作業が少し難しくなります。(たとえば) いくつかのローカルを定義し、それへの参照を返すこともできます (ただし、ほとんどのコンパイラはこれについて警告することができます)。
参照の代わりに値を返すことには、理論的および実際的な問題があります。=
理論的な側面では、通常の意味とこの場合の意味との間に基本的な断絶があります。特に、割り当ては通常、「この既存のソースを取得して、その値をこの既存の宛先に割り当てる」ことを意味しますが、「この既存のソースを取得し、そのコピーを作成し、その値をこの既存の宛先に割り当てる」という意味になります。 "
実用的な観点から、特に右辺値参照が発明される前は、パフォーマンスに重大な影響を与える可能性がありました. A から B にコピーする過程でまったく新しいオブジェクトを作成することは予想外であり、多くの場合非常に遅くなりました. たとえば、小さなベクトルがあり、それを大きなベクトルに割り当てた場合、小さなベクトルの要素をコピーするのにせいぜい時間がかかり、サイズを調整するための (少し) 固定オーバーヘッドがかかると予想されます。宛先ベクトル。代わりに、 2 つのコピー (ソースから一時へのコピー、一時から宛先への別のコピー)、および (さらに悪いことに) 一時ベクトルの動的割り当てが含まれる場合、操作の複雑さについての私の期待は完全に破壊されました。ベクトルが小さい場合、動的割り当てにかかる時間は、要素をコピーする時間よりも何倍も長くなる可能性があります。
他の唯一のオプション (C++11 で追加) は、右辺値参照を返すことです。これは簡単に予期しない結果につながる可能性があります. のような連鎖代入はand/ora=b=c;
の内容を破壊する可能性があります.これはまったく予期しないことです.b
c
そのため、通常の参照 (const への参照でも右辺値参照でもない) を返すことが、ほとんどの人が通常必要とするものを (合理的に) 確実に生成する唯一のオプションとして残されます。