6

セクション 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()
{ 

}

デモ

コピー コンストラクターは明示的に削除されません。しかし、そうではありません。

4

2 に答える 2

1

非推奨とは、通常、何かが機能することを意味しますが、眉をひそめ、将来は機能しない可能性があることを意味します。標準では、ユーザー宣言のコピー代入演算子またはユーザー宣言のデストラクタを作成すると、デフォルトのコピー コンストラクタが作成される (まだ作成していない場合) と言っていると思いますが、将来的には作成されない可能性があります。そのため、他の 2 つのうちの 1 つを持っている場合は、今すぐ独自のコピー コンストラクターを作成する必要があり、将来的には強制される可能性があります。

于 2014-11-01T08:50:16.593 に答える