1

移動のみのクラスの移動コンストラクターを暗黙的に生成する方法はありますか? 次のようなクラスを考えてみましょう:

class moveable_only
{
  unique_ptr<int> p_;
};

moveable_only m;
foo(std::move(m));

暗黙的に宣言されたコピー コンストラクターは p_ をコピーできないため、これはコンパイルされません。(12.8/7)

クラス定義でコピー コンストラクターが明示的に宣言されていない場合は、暗黙的に宣言されます。クラス定義でムーブ コンストラクターまたはムーブ代入演算子が宣言されている場合、暗黙的に宣言されたコピー コンストラクターは削除済みとして定義されます。それ以外の場合は、デフォルト (8.4) として定義されます。

これを考慮してください:

class moveable_only
{
  unique_ptr<int> p_;
  
   moveable_only(const moveable_only&);
   moveable_only& operator = (const moveable_only&);
};

moveable_only m;
foo(std::move(m));

12.8/9 のため、これもコンパイルされません。

クラス X の定義でムーブ コンストラクターが明示的に宣言されていない場合、1 つが暗黙的にデフォルトとして宣言されます。

— X にはユーザー宣言のコピー コンストラクターがありません。

— X には、ユーザー宣言のコピー代入演算子がありません。

— X には、ユーザーが宣言した移動代入演算子がありません。

— X にはユーザー宣言のデストラクタがなく、かつ

— 移動コンストラクターは暗黙的に削除済みとして定義されません。

4

1 に答える 1

4

暗黙的に宣言されたコピー コンストラクターは p_ をコピーできないため、これはコンパイルされません。(12.8/7)

コピー コンストラクターは必要ありません。これは、コンパイラが移動コンストラクタを自動的に生成しないように見えるため、コンパイルされませ

自分で実装するか、コンパイラを更新する以外に方法はありません。

于 2012-11-21T15:54:04.990 に答える