規格によると、
クラス X の定義でムーブ コンストラクターが明示的に宣言されていない場合、1 つが暗黙的にデフォルトとして宣言されます。
— X にはユーザー宣言のコピー コンストラクターがありません。
— X には、ユーザー宣言のコピー代入演算子がありません。
— X にはユーザー宣言の移動代入演算子がなく、かつ
— X にはユーザー宣言のデストラクタがありません。
現在、以下はコンパイルに失敗します
# include <utility>
class Foo
{
public:
Foo() = default;
Foo(Foo const &) = delete;
};
int main()
{
Foo f;
Foo g(std::move(f)); // compilation fails here
return 0;
}
したがって、削除された関数はユーザー定義と見なされるようです。これは理にかなっています (デフォルトの実装ではありません)。ただし、その特定のケースでは、削除されたコピー コンストラクター/代入の混乱はどのようにデフォルトの移動コンストラクター/代入になるでしょうか?
手動生成と esp. このようなデフォルト関数のメンテナンスはエラーが発生しやすいと同時に、std::unique_ptr
クラス メンバーなどのクラスの使用が (正当に) 増加したことで、コピー不可能なクラスが以前よりもはるかに一般的な獣になりました。