AUTOSAR C++14 Rule A12-8-7
Assignment operators should be declared with the ref-qualifier &
説明
ルール定義
Assignment operators should be declared with the ref-qualifier &.
根拠
ref 修飾子を使用して、lvalue または rvalue に関数と演算子のどちらかを適用するかを指定できます。lvalue に適用される関数または演算子には ref 修飾子 & が付加されます。rvalue に適用される関数または演算子には宣言の最後に ref 修飾子 && が付加されます。
C++ の組み込み代入演算子は、入力パラメーターとして lvalue のみを受け入れます。ユーザー定義の代入演算子が入力パラメーターとして rvalue と lvalue の両方を取る場合、それは混乱の原因となり、エラーを引き起こす可能性があります。クラス obj 用のユーザー定義の代入演算子が入力パラメーターとして rvalue と lvalue の両方を受け入れる次のコードについて考えます。
class obj{
obj& operator=(Obj const&){
//...
return *this;
}
//...
};
int main(){
int i,j,k;
obj a,b,c;
if((i+j)=k) // compilation error
//...
if((a+b)=c) // silent error
//...
}最初の
ifステートメントでは、等号演算子 (==) が誤記により代入演算子 (=) と記述されています。int用の組み込み代入演算子は入力として rvalue を受け入れないため、ステートメント(i+j) = kはコンパイル エラーを引き起こします。2 番目の
ifステートメントの条件に同様のエラーが含まれています。クラスobj用のユーザー定義の代入演算子は入力として rvalue と lvalue の両方を受け入れるため、ステートメント(a+b) = cはエラーなしでコンパイルされます。ifブロックは予期せず実行されるため、サイレント バグにつながります。
エラーと混乱を避けるには、ref 修飾子 & を宣言に追加することによって、代入演算子が入力パラメーターとして lvalue のみを取るように指定します。
Polyspace 実装
Polyspace® は、以下の場合のユーザー定義の代入、複合代入、インクリメント、およびデクリメント演算子にフラグを設定します。
宣言に ref 修飾子
&が含まれていない。クラスのメンバー関数である。
= deleteとして宣言されていない。
ref 修飾子は非静的メンバー関数にしか適用できないため、このルールは非メンバー代入演算子には適用されません。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 特殊なメンバー関数 |
| カテゴリ: Advisory、Automated |
バージョン履歴
R2020b で導入