vs2010 が出荷されたときと比較して、これらのルールの遅れに関して既に与えられた適切な回答に加えて、
暗黙的に生成されたムーブ コンストラクターのルールは次のとおりです。
クラス X の定義でムーブ コンストラクターが明示的に宣言されていない場合、1 つが暗黙的にデフォルトとして宣言されます。
- X にはユーザー宣言のコピー コンストラクターがありません。
- X には、ユーザー宣言のコピー代入演算子がありません。
- X には、ユーザー宣言の移動代入演算子がありません。
- X にはユーザー宣言のデストラクタがありません。
- 移動コンストラクターは、暗黙的に削除済みとして定義されません。
暗黙的に生成された移動代入演算子の規則は、上記のパターンに従います。
コピー コンストラクターが暗黙的に生成される場合のルールが少し変更されました。
クラス定義でコピー コンストラクターが明示的に宣言されていない場合は、暗黙的に宣言されます。クラス定義でムーブ コンストラクターまたはムーブ代入演算子が宣言されている場合、暗黙的に宣言されたコピー コンストラクターは削除済みとして定義されます。それ以外の場合は、デフォルト (8.4) として定義されます。クラスにユーザー宣言のコピー代入演算子またはユーザー宣言のデストラクタがある場合、後者のケースは推奨されません。
コピー代入演算子についても同様です。
クラス定義でコピー代入演算子が明示的に宣言されていない場合は、暗黙的に宣言されます。クラス定義でムーブ コンストラクターまたはムーブ代入演算子が宣言されている場合、暗黙的に宣言されたコピー代入演算子は削除済みとして定義されます。それ以外の場合は、デフォルト (8.4) として定義されます。クラスにユーザー宣言のコピー コンストラクターまたはユーザー宣言のデストラクタがある場合、後者のケースは推奨されません。
結論: 3 のルールは 5 のルールになりました。5 つすべてを無視するか (デフォルトの動作がうまくいく場合)、または 5 つすべてについて考える (そしておそらく定義する) 必要があります。
- コピーコンストラクター
- 課題のコピー
- 移動コンストラクタ
- 割り当てを移動
- デストラクタ