AUTOSAR C++14 Rule A12-8-4
Move constructor shall not initialize its class members and base classes using copy semantics
説明
ルール定義
Move constructor shall not initialize its class members and base classes using copy semantics.
根拠
C++ では、移動演算はソース オブジェクトからターゲット オブジェクトにリソースそのものを複製するのではなく、リソースの所有権を移譲します。移動コンストラクターはリソースを複製しないため、コピー コンストラクターより高速です。CopyTarget オブジェクトがコピー構築され、MoveTarget オブジェクトが Source オブジェクトから移動構築される次のコードについて考えます。
class BigData{
//...
BigData(BigData&&){ //Move Constructor
//...
} copy constructed
BigData(const BigData&){ //Copy Constructor
//...
}
private:
std::map<int, std::string> BigBook;
};
int main(){
BigData Source;
BigData CopyTarget = Source;
BigData Movetarget = std::move(Source);
//...
}CopyTarget をコピー構築する場合は、コンパイラが Source から CopyTarget にリソース Source::BigBook を複製します。コピー構築後は、これらの両方のオブジェクトにリソース BigBook のコピーが追加されます。Movetarget を移動構築する場合は、コンパイラがリソース Source::BigBook の所有権を MoveTarget に移譲します。移動構築は物理的にリソースを複製しないため、コピー構築より高速です。
移動構築は最適化戦略です。移動構築はコピー構築より低コストで高速であると想定します。データ メンバーと基底クラスのコピー初期化は、移動コンストラクターを低速で非効率にして、プログラムのパフォーマンスを低下させる可能性があります。開発者は、移動構築では移動セマンティクスのみが使用されると想定します。想定に反して、移動コンストラクターでコピーのセマンティクスを使用すると、リソース リークや将来の開発での矛盾が発生する可能性があります。移動コンストラクターを作成するときに、移動セマンティクスを使用してデータ メンバーと基底クラスを初期化します。このルールに違反することなく、スカラー データ メンバーをコピー初期化できます。
std::move() を使用して、コード内に移動セマンティクスを実装することもできます。std::move() を使用してオブジェクトを移動する場合は、修飾子 const を使用せずにオブジェクトまたはデータ メンバーを宣言します。詳細については、AUTOSAR C++14 Rule A18-9-3を参照してください。
Polyspace 実装
移動コンストラクターが移動セマンティクスを使用して非スカラー データ メンバーと基底クラスを初期化しない場合は、Polyspace® がその宣言にフラグを設定します。たとえば、移動コンストラクターが移動コンストラクターではなく既定のコンストラクターを使用して基底クラスを初期化する場合は、Polyspace がその移動コンストラクターの宣言にフラグを設定します。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 特殊なメンバー関数 |
| カテゴリ: Required、Automated |
バージョン履歴
R2020b で導入