セクション 12.8/7 の標準は次のように述べています。
クラス定義でコピー コンストラクターが明示的に宣言されていない場合は、暗黙的に宣言されます。クラス定義でムーブ コンストラクターまたはムーブ代入演算子が宣言されている場合、暗黙的に宣言されたコピー コンストラクターは削除済みとして定義されます。それ以外の場合は、デフォルト (8.4) として定義されます。クラスにユーザー宣言のコピー代入演算子またはユーザー宣言のデストラクタがある場合、後者のケースは推奨されません 。したがって、クラス定義については
struct X { X(const X&, int); };
コピー コンストラクターが暗黙的に宣言されています。ユーザーが宣言したコンストラクターが後で次のように定義されている場合
X::X(const X& x, int i =0) { /∗ ... ∗/ }
その要点がわかりません クラスにユーザー宣言のコピー代入演算子またはユーザー宣言のデストラクタがある場合、後者のケースは非推奨です。この例では、標準はユーザー宣言のコピー代入演算子もデストラクタも提供していません。デストラクタまたはコピー代入演算子を宣言するとどうなりますか? 私は次のようにそれをやろうとしました:
struct A
{
~A(){ };
};
A::A(const A&){ }; //error
int main(){ }
ただし、この例では、暗黙的に宣言されたコピー コンストラクターがまだあります。そのルールの実際の意味は何ですか?
次のように書けば、と思いました。
struct A
{
A(){ };
A(const A&&){ };
~A(){ };
};
A a;
A t = a; //error: call to implicitly-deleted copy constructor of 'A'
int main()
{
}
コピー コンストラクターは明示的に削除されません。しかし、そうではありません。