为什么定义析构函数会删除隐式定义的移动赋值运算符?

时间:2015-12-02 12:06:23

标签: c++ c++11 destructor move-assignment-operator

在定义定制析构函数时,C ++标准委员会选择删除隐式定义的移动赋值运算符的理由是什么?

2 个答案:

答案 0 :(得分:5)

来自Scott Meyer的有效现代C ++第17项(假设您了解Rule of Three):

  

规则三的结果是,用户声明的析构函数的存在表明简单的成员复制不太可能适合于类中的复制操作。反过来,这表明如果一个类声明了一个析构函数,那么复制操作可能不应该自动生成,因为它们不会做正确的事情。 [...]

     

然而,“三条规则”背后的推理仍然有效,并且结合观察到复制操作的声明排除了隐式生成移动操作的观点,激发了C ++ 11 不<的事实/ em>使用用户声明的析构函数为类生成移动操作。

答案 1 :(得分:5)

这个想法是存在任何默认生成的结构(复制构造函数,复制赋值或析构函数)表明类型需要进行某种特殊的资源管理。如果是这种情况,默认移动操作可能不会做正确的事情。我不确定实际上是否存在默认生成的复制构造函数正常工作但默认生成的移动构造函数失败的示例。

分辨率是默认情况下生成移动操作更安全,特别是因为很容易要求相应的移动操作:只需添加= default ed实现。无论如何,班级显然已经做了一些特别的事情(否则就没有破坏者)。