142

コンパイラーがデフォルトのコンストラクター、コピーコンストラクター、および代入演算子を通常自動生成する条件で、メモリを更新したいと思います。

いくつかのルールがあったことを思い出しますが、覚えていません。また、信頼できるリソースをオンラインで見つけることができません。誰か助けてもらえますか?

4

3 に答える 3

146

以下で、「自動生成」とは、「デフォルトとして暗黙的に宣言されているが、削除済みとして定義されていない」ことを意味します。特殊メンバー関数が宣言されているが、削除済みとして定義されている場合があります。

  • ユーザーが宣言したコンストラクターがない場合、デフォルトのコンストラクターは自動生成されます(§12.1/ 5)。
  • コピーコンストラクターは、ユーザーが宣言した移動コンストラクターまたは移動代入演算子がない場合に自動生成されます(C ++ 03には移動コンストラクターまたは移動代入演算子がないため、C ++ 03では「常に」に簡略化されます)( §12.8/8)。
  • コピー代入演算子は、ユーザーが宣言したムーブコンストラクターまたはムーブ代入演算子がない場合に自動生成されます(§12.8/ 19)。
  • ユーザーが宣言したデストラクタがない場合、デストラクタは自動生成されます(§12.4/ 4)。

C ++ 11以降のみ:

  • ユーザーが宣言したコピーコンストラクター、コピー代入演算子、またはデストラクタがなく、生成された移動コンストラクターが有効な場合(§12.8/ 10)、移動コンストラクターは自動生成されます。
  • ムーブ代入演算子は、ユーザーが宣言したコピーコンストラクタ、コピー代入演算子、またはデストラクタがない場合、および生成されたムーブ代入演算子が有効な場合(たとえば、定数メンバーを割り当てる必要がない場合)に自動生成されます(§12.8/ 21)。
于 2011-02-09T11:17:46.320 に答える
120

下の図は非常に便利です。

自動コンストラクターと代入演算子のC++ルールスティッキービット から-ゼロヒーローのルールになる

于 2016-07-08T01:02:31.820 に答える
4

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)。暗黙的に宣言されたデストラクタは、そのクラスのインラインパブリックメンバーです。

于 2018-11-15T09:09:45.633 に答える