在定义定制的析构函数时,C++标准委员会选择删除隐式定义的移动赋值运算符的理由是什么?
来自Scott Meyer的有效现代C++第17项(假设您已了解三条规则):
规则三的结果是,用户声明的析构函数的存在表明简单的成员复制不太可能适合于类中的复制操作.反过来,这表明如果一个类声明了一个析构函数,那么复制操作可能不应该自动生成,因为它们不会做正确的事情.[...]
三规则背后的原因仍然是有效的,但是那,结合观察复制操作该声明排除了移动操作的隐代,激励的事实,C++ 11并没有产生移动操作与一类用户声明的析构函数.
这个想法是任何默认生成的结构(复制构造函数,复制赋值或析构函数)的存在表明类型需要进行某种特殊的资源管理.如果是这种情况,默认移动操作可能不会做正确的事情.我不确定实际上是否存在默认生成的复制构造函数正常工作但是默认生成的移动构造函数失败的示例.
解决方案是默认情况下不生成移动操作更安全,特别是因为很容易要求相应的移动操作:只需添加一个= default
ed实现.无论如何,这个班级显然已经做了一些特别的事情(否则就没有破坏者).