コンパイラーがデフォルトのコンストラクター、コピーコンストラクター、および代入演算子を通常自動生成する条件で、メモリを更新したいと思います。
いくつかのルールがあったことを思い出しますが、覚えていません。また、信頼できるリソースをオンラインで見つけることができません。誰か助けてもらえますか?
コンパイラーがデフォルトのコンストラクター、コピーコンストラクター、および代入演算子を通常自動生成する条件で、メモリを更新したいと思います。
いくつかのルールがあったことを思い出しますが、覚えていません。また、信頼できるリソースをオンラインで見つけることができません。誰か助けてもらえますか?
以下で、「自動生成」とは、「デフォルトとして暗黙的に宣言されているが、削除済みとして定義されていない」ことを意味します。特殊メンバー関数が宣言されているが、削除済みとして定義されている場合があります。
下の図は非常に便利です。
スティッキービット
から-ゼロヒーローのルールになる
C ++17N4659標準ドラフト
クロススタンダードのクイックリファレンスについては、次のcppreferenceエントリの「暗黙的に宣言された」セクションを参照してください。
もちろん、同じ情報を標準から取得できます。例: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)。暗黙的に宣言されたデストラクタは、そのクラスのインラインパブリックメンバーです。