通常、コンパイラーがデフォルトのコンストラクター、コピーコンストラクター、および代入演算子を自動生成する条件で、メモリを更新します。
いくつかのルールがあったことを思い出しますが、覚えていません。また、信頼できるリソースをオンラインで見つけることもできません。誰か助けてもらえますか?
通常、コンパイラーがデフォルトのコンストラクター、コピーコンストラクター、および代入演算子を自動生成する条件で、メモリを更新します。
いくつかのルールがあったことを思い出しますが、覚えていません。また、信頼できるリソースをオンラインで見つけることもできません。誰か助けてもらえますか?
回答:
以下では、「自動生成」は「デフォルトとして暗黙的に宣言されているが、削除済みとして定義されていない」ことを意味します。特別なメンバー関数が宣言されているが、削除済みとして定義されている状況があります。
const
クラスにメンバーがあると、コンストラクターの自動生成が妨げられることをおそらく言及する必要があると思います...
以下の図は非常に便利です。
= delete
(自明)または= default
(自明ではない)に設定する2つのケースが含まれます。私は正しいですか?
C ++ 17 N4659標準ドラフト
簡単な相互参照については、次の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)。暗黙的に宣言されたデストラクタは、そのクラスのインラインパブリックメンバーです。