根据标准,
如果类 X 的定义没有显式声明移动构造函数,当且仅当
— 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
如类成员)使用的(正义的)增加使得不可复制的类比过去更常见。