gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:41:45 34 4
gpt4 key购买 nike

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

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

只有当用户没有分别定义拷贝构造函数或赋值运算符时,才会生成拷贝构造函数或赋值运算符。

我想知道为什么会有差异。

最佳答案

我相信向后兼容性在这里起着重要作用。如果用户定义了任何“三规则”函数(copy ctor、copy assignment op、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 的双重删除。

关于阻止默认移动构造函数定义的移动赋值运算符:如果移动赋值运算符执行默认值以外的其他操作,则使用默认移动构造函数很可能是错误的。这只是有效的“三法则”/“五法则”。

关于c++ - 默认移动构造函数与默认复制构造函数与默认赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15634503/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com