对于不可移动的类型,是否足够(从最佳实践角度来看)?
class A
{
A(const A&) = delete;
A(A&&) = delete;
A& operator=(A) = delete;
public:
A();
};
Run Code Online (Sandbox Code Playgroud)
或者我是否必须单独删除复制/移动赋值运算符?这里还需要一个析构函数?
是的,声明复制构造函数和复制赋值运算符deleted就足够了.由于您要声明复制构造函数和复制赋值运算符,因此不会自动生成移动构造函数和移动赋值运算符.您不需要显式声明它们deleted.
来自§12.8/ 9(强调增加)
如果类X的定义没有显式声明一个移动构造函数,那么当且仅当
-X没有用户声明的复制构造函数时,将隐式声明一个默认值,
- X没有用户声明的复制赋值运算符,
- X没有用户声明的移动赋值运算符,
- X没有用户声明的析构函数,并且
- 移动构造函数不会被隐式定义为已删除.
来自§12.8/ 20(强调增加)
如果类X的定义没有显式地声明一个移动赋值运算符,那么当且仅当
-X没有用户声明的复制构造函数时,将隐式声明一个默认值,
- X没有用户声明的移动构造函数,
- X没有用户声明的复制赋值运算符,
- X没有用户声明的析构函数,并且
- 移动赋值运算符不会被隐式定义为已删除.