*this はコピー代入演算子に返されません
operator= メソッドが現在のオブジェクトを指すポインターを返さない
説明
この欠陥は、operator= や operator+= などの代入演算子が *this への参照を返さない場合に発生します。ここで、this は現在のオブジェクトを指すポインターです。operator= メソッドが *this を返さない場合、これは、a=b または a.operator=(b) が代入後に代入先 a を返していないことを意味します。
次に例を示します。
演算子が、それ自体のパラメーターを現在のオブジェクトへの参照の代わりに返します。
つまり、演算子が取る形式は、
MyClass & operator=(const MyClass & rhs) { ... return *this; }ではなくMyClass & operator=(const MyClass & rhs) { ... return rhs; }です。演算子を参照ではなく、値で返します。
つまり、演算子が取る形式は、
MyClass & operator=(const MyClass & rhs) { ... return *this; }ではなくMyClass operator=(const MyClass & rhs) { ... return *this; }です。
リスク
通常、オブジェクトの代入は組み込み型間での代入のように動作するものと想定され、また、代入により代入先が返されるものと想定されます。たとえば、右結合の連鎖代入 a=b=c では、代入後に b=c が代入先 b を返すよう求められます。代入演算子が異なった動作をする場合、ユーザー クラスには予期しない結果がもたらされる可能性があります。
予期しない結果は、代入が別のステートメントの一部である場合に発生します。次に例を示します。
operator=が現在のオブジェクトへの参照ではなく、それ自体のパラメーターを返す場合、代入a=bはaではなくbを返します。operator=がデータ メンバーの部分的な代入を実行する場合、代入a=bの後ではaとbのデータ メンバーは異なります。ユーザー クラスで戻り値のデータ メンバーを読み取る際にaのデータ メンバーを想定している場合は、予期しない結果になる可能性があります。例は、引数と同じ operator= の戻り値を参照してください。operator=メソッドが*thisを参照ではなく値で返す場合は、*thisのコピーが返されます。代入の結果を(a=b).modifyValue()のようなステートメントを使用して変更する場合、変更するのはaのコピーであり、aそのものではありません。
修正方法
*this を代入演算子から返すようにします。
例
結果情報
| グループ: オブジェクト指向 |
| 言語: C++ |
| 既定値: オフ |
コマンド ライン構文: RETURN_NOT_REF_TO_THIS |
| 影響度: Low |
バージョン履歴
R2015b で導入