是否足以删除operator =(Type type)?

ron*_*nag 21 c++ c++11

对于不可移动的类型,是否足够(从最佳实践角度来看)?

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

或者我是否必须单独删除复制/移动赋值运算符?这里还需要一个析构函数?

Cap*_*ous 8

是的,声明复制构造函数和复制赋值运算符deleted就足够了.由于您要声明复制构造函数和复制赋值运算符,因此不会自动生成移动构造函数和移动赋值运算符.您不需要显式声明它们deleted.

来自§12.8/ 9(强调增加)

如果类X的定义没有显式声明一个移动构造函数,那么当且仅当
-X没有用户声明的复制构造函数时,将隐式声明一个默认值,
- X没有用户声明的复制赋值运算符,
- X没有用户声明的移动赋值运算符,
- X没有用户声明的析构函数,并且
- 移动构造函数不会被隐式定义为已删除.

来自§12.8/ 20(强调增加)

如果类X的定义没有显式地声明一个移动赋值运算符,那么当且仅当
-X没有用户声明的复制构造函数时,将隐式声明一个默认值,
- X没有用户声明的移动构造函数,
- X没有用户声明的复制赋值运算符,
- X没有用户声明的析构函数,并且
- 移动赋值运算符不会被隐式定义为已删除.