14

そうだと思いますが、私の印象を確認するために C++11 言語の弁護士を探しています。次のクラスは本当ですか?

struct X{
X(){}
X(X const&)=default;
};

は、コピー コンストラクターが "ユーザー宣言" であるため、自動的に移動可能 (つまり、取得X(X&&)および) にはなりません。operator=(X&&)

struct X{
};

これは、暗黙的に宣言され、使用時に(自明に)定義されるなどの両方を取得X(X const&)します。X(X&&)

4

4 に答える 4

3

標準から:

8.4.2 明示的にデフォルト設定された関数 [dcl.fct.def.default]

4 - [...] ユーザーが宣言し、最初の宣言で明示的にデフォルト設定または削除されていない場合、特別なメンバー関数はユーザー提供です。[...]

明示的なデフォルトは、その宣言と組み合わせることができます。または、別々にすることもできます。

struct S {
    S();
};
S::S() = default;

いずれの場合も、その (最初の) 宣言はユーザー宣言になります。

于 2012-08-22T13:42:29.587 に答える
3

はい、デフォルトのコピー割り当て演算子は、暗黙の移動 ctor を排除します。

ところで、置くこと=defaultは実際には定義です。pimpl イディオムを実装しようとしてstd::unique_ptr、ヘッダーから削除=defaultして実装ファイルに配置する必要があったことを覚えています。デストラクタにunique_ptrは、クリーンアップしようとしているクラスの定義が必要だったからです。

于 2012-08-22T14:23:12.513 に答える
2

defaulted コピー コンストラクター、実際には「ユーザー宣言」です。defaultの追加が、実際に用語を「ユーザー定義」から「ユーザー宣言」に変更した理由だと思います。

于 2012-08-22T12:52:17.547 に答える
1

そうです、§12.8 は、ムーブ コンストラクターが暗黙的に宣言され、ユーザー宣言のコピー コンストラクターの存在がそれを排除する場合の条件を設定します。持つことはできません

  • ユーザー宣言のコピー コンストラクター
  • ユーザー宣言のコピー代入演算子
  • ユーザー宣言の移動代入演算子
  • ユーザー宣言のデストラクタ
于 2012-08-22T13:24:58.530 に答える