AUTOSAR C++14 Rule A12-8-2
User-defined copy and move assignment operators should use user-defined no-throw swap function
R2021a 以降
説明
ルール定義
User-defined copy and move assignment operators should use user-defined no-throw swap function.
根拠
スワップ関数を使用せずに実装されたネイティブなコピー代入演算子または移動代入演算子は、次のコード内のパターンに従っている可能性があります。
class A{
//...
A & operator=(const A & rhs)
{
if (this != &rhs) // check for self assignment
{
// release resource in lhs
// Allocate resource for modified lhs
// Copy or move the resources from rhs to lhs
}
return *this;
}
private:
//resources
int* mArray;
};これらの問題を解決するには、例外を発生させないユーザー定義の関数 swap を使用してください。次のパターンについて考えます。
class A{
//...
A & operator=(A rhs)
{
Swap(*this,rhs);
}
friend void Swap(A& lhs, A& rhs) noexcept{
//...
}
private:
//resources
int* mArray;
};noexcept 関数 Swap を呼び出すことによって、左オペランドと右オペランドのリソースを入れ替えます。この関数 Swap は、関数 std::swap を利用して実装される場合があります。このパターンのメリットを以下に示します。
強力な例外安全性:このコピー代入演算子または移動代入演算子の実装は、コピー コンストラクターまたは移動コンストラクターを使用して右オペランドの一時コピーを作成し、その一時コピーと左オペランドを入れ替えます。移動関数とスワップ関数は
noexceptにする必要があるため、例外が発生する可能性があるのはコピー演算だけです。この演算子で例外が発生した場合に、無効になる可能性があるのは右オペランドの一時コピーだけです。右オペランドまたは左オペランドの状態は変化しません。コードの再利用:この実装では、コピー代入演算子または移動代入演算子でコピー コンストラクターまたは移動コンストラクターが再利用されます。他のアルゴリズムを実装するために、クラス固有の関数
swapを再利用することもできます。効率性:自己代入に対するチェックを排除することによって、演算子の効率が高まります。
コピー代入演算子または移動代入演算子を実装するには、ユーザー定義の noexcet スワップ関数を使用してください。
Polyspace 実装
Polyspace® は、少なくとも 1 つのユーザー定義のスワップ関数に対する呼び出しを含まないコピー代入演算子または移動代入演算子にフラグを設定します。また、Polyspace は、シグネチャが void T::swap(T&) または void [N::]swap(T&, T&) である関数をスワップ関数として識別します。最初のシグネチャは、1 つの引数を取るクラス T のメンバー関数を表します。2 番目のシグネチャは、2 つの引数を取る名前空間 N 内の非メンバー関数または静的関数を表します。swap という名前の大文字と小文字は区別されず、先頭または末尾にアンダースコアを付加できます。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 特殊なメンバー関数 |
| カテゴリ: Advisory、Automated |
バージョン履歴
R2021a で導入