为什么 C++ 编译器对自动生成的移动构造函数比对自动生成的复制构造函数或赋值运算符有更多限制?
仅当用户未定义任何内容时,才会生成自动生成的移动构造函数(即:构造函数、复制、赋值、析构函数......)
仅当用户未分别定义复制构造函数或赋值运算符时,才会生成复制构造函数或赋值运算符。
我想知道为什么有区别。
我相信向后兼容性在这里起着重要作用。如果用户定义任何“三规则”函数(复制构造函数、复制分配操作、dtor),则可以假设该类执行一些内部资源管理。在 C++11 下编译时,隐式定义移动构造函数可能会突然使该类无效。
考虑这个例子:
class Res
{
int *data;
public:
Res() : data(new int) {}
Res(const Res &arg) : data(new int(*arg.data)) {}
~Res() { delete data; }
};
现在,如果为此类生成了默认的移动构造函数,则其调用将导致双重删除data
.
至于移动赋值运算符阻止默认移动构造函数定义:如果移动赋值运算符执行默认操作以外的操作,则使用默认移动构造函数很可能是错误的。这只是有效的“三规则”/“五规则”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)