コンパイラーが通常、デフォルトのコンストラクター、コピーコンストラクター、および代入演算子を自動生成する条件で、メモリを更新します。
いくつかのルールがあったことを思い出しますが、覚えていないし、評判の良いリソースをオンラインで見つけることもできません。誰でも助けることができますか?
以下では、「自動生成」とは、「デフォルトとして暗黙的に宣言されているが、削除済みとして定義されていない」ことを意味します。特別なメンバー関数が宣言されているが、削除済みとして定義されている場合があります。
下の図は非常に便利です。
C++ 17 N4659標準ドラフト
クロス標準のクイックリファレンスについては、次のcppreferenceエントリの「暗黙的に宣言された」セクションを参照してください。
もちろん、標準から同じ情報を取得できます。例えば。 on C++ 17 N4659標準ドラフト :
15.8.1「コンストラクタのコピー/移動」は、コンストラクタのコピーについて次のように述べています。
6クラス定義でコピーコンストラクターが明示的に宣言されていない場合、非明示的なコンストラクターが暗黙的に宣言されます。クラス定義が移動コンストラクターまたは移動代入演算子を宣言する場合、暗黙的に宣言されたコピーコンストラクターは削除済みとして定義されます。それ以外の場合は、デフォルト(11.4)として定義されます。後者のケースは、クラスにユーザーが宣言したコピー割り当て演算子またはユーザーが宣言したデストラクタがある場合は非推奨です。
移動コンストラクターの場合:
8クラスXの定義が移動コンストラクターを明示的に宣言していない場合、非明示的なコンストラクターは、次の場合にのみデフォルトとして暗黙的に宣言されます。
(8.1)— Xにはユーザーが宣言したコピーコンストラクターがありません。
(8.2)— Xにはユーザーが宣言したコピー割り当て演算子がありません。
(8.3)— Xには、ユーザーが宣言した移動代入演算子がありません。
(8.4)— Xにはユーザーが宣言したデストラクタがありません。
15.8.2「コピー/移動割り当て演算子」はコピー割り当てについて次のように述べています。
2クラス定義でコピー代入演算子が明示的に宣言されていない場合、コピー代入演算子が暗黙的に宣言されます。クラス定義が移動コンストラクターまたは移動代入演算子を宣言する場合、暗黙的に宣言されたコピー代入演算子は削除済みとして定義されます。それ以外の場合は、デフォルト(11.4)として定義されます。後者のケースは、クラスにユーザー宣言されたコピーコンストラクターまたはユーザー宣言されたデストラクタがある場合は推奨されません。
移動の割り当ての場合:
4クラスXの定義で移動代入演算子が明示的に宣言されていない場合、次の場合にのみデフォルトとして暗黙的に宣言されます。
- (4.1)— Xにはユーザーが宣言したコピーコンストラクターがありません。
- (4.2)— Xにはユーザーが宣言した移動コンストラクターがありません。
- (4.3)— Xにはユーザーが宣言したコピー割り当て演算子がありません。
- (4.4)— Xにはユーザーが宣言したデストラクタがありません。
15.4「デストラクタ」は、デストラクタに対して次のように述べています。
4クラスにユーザーが宣言したデストラクタがない場合、デストラクタは暗黙的にデフォルトとして宣言されます(11.4)。暗黙的に宣言されたデストラクタは、そのクラスのインラインパブリックメンバーです。