移動のみのクラスの移動コンストラクターを暗黙的に生成する方法はありますか? 次のようなクラスを考えてみましょう:
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 にはユーザー宣言のデストラクタがなく、かつ
— 移動コンストラクターは暗黙的に削除済みとして定義されません。