c++ 默认移动构造函数与默认复制构造函数对默认赋值运算符

为什么C编译器对自动生成的移动构造函数比自动生成的复制构造函数或赋值操作符有更多的限制?

仅当用户未定义任何内容(即:构造函数,复制,赋值,析构函数…)时才会生成自动生成的移动构造函数。

仅当用户未分别定义复制构造函数或赋值运算符时,才会生成复制构造函数或赋值运算符。

我想知道为什么差别。

最佳答案
我相信向后兼容性在这里是很大的一部分。如果用户定义任何“三个规则”函数(复制ctor,复制赋值操作,dtor),则可以假定该类执行一些内部资源管理。隐式定义一个移动构造函数可能会突然使类在C 11下编译时无效。

考虑这个例子:

class Res
{
  int *data;

public:
  Res() : data(new int) {}

  Res(const Res &arg) : data(new int(*arg.data)) {}

  ~Res() { delete data; }
};

现在如果为这个类生成了默认的移动构造函数,它的调用将导致数据的双重删除。

至于移动赋值操作符阻止默认移动构造函数定义:如果移动赋值操作符执行除默认移动赋值操作以外的其他操作,那么使用默认移动构造函数很可能是错误的。这只是“三条规则”/“五条规则”生效。

转载注明原文:c++ 默认移动构造函数与默认复制构造函数对默认赋值运算符 - 代码日志