具有自动默认和移动构造函数的Uncopyable类

Xir*_*dus 5 c++ default-copy-constructor move-constructor c++11

我想让一些类使用自动生成的构造函数,但是不可复制(但仍可移动).目前我这样做:

class A
{
public:
    A() = default;
    A(const A&) = delete;
    A(A&&) = default;
    A& operator=(const A&) = delete;
    A& operator=(A&&) = default;
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否真的有必要这么明确.如果我这样写的话怎么办:

class A
{
    A(const A&) = delete;
    A& operator=(const A&) = delete;
}
Run Code Online (Sandbox Code Playgroud)

它仍然可以工作吗?对于其他情况,最小的默认值和删除集是什么 - 不可复制的非可移动类和具有虚拟析构函数的类?

是否有任何测试代码可用于快速查看隐式创建的构造函数?

n. *_* m. 6

这不起作用,因为不会自动为您创建默认构造函数.由于您已声明了复制构造函数,因此不会创建默认构造函数.它被定义为已删除,但它仍然是用户声明的,因此没有隐式默认的默认构造函数.

隐式创建的构造函数的精简规则是:

  • 默认移动构造函数和默认移动赋值运算符是隐式创建的,除非您已声明任何其他Big 5特殊函数(除非被非可移动成员或基础阻止)
  • 默认构造函数(名称!)是隐式创建的,除非您声明了任何构造函数(除非由非默认可创建成员或基础阻止)
  • 除非您已声明移动构造函数或移动赋值运算符(并且除非由不可复制的成员或基础阻止),否则将创建默认的复制构造函数和默认的复制赋值运算符