c++ - 为什么定义移动构造函数会删除移动赋值运算符
问题描述
当我写"f5() = X(33);"
(在注释行中移动构造函数时)编译器不会抛出错误。但是当我添加一个 Move Constructor 编译器时说:
" 'X &X::operator =(const X &)': attempting to reference a deleted function "
是移动构造函数删除赋值运算符??
#include <iostream>
class X {
int* p;
public:
X(int ii = 0) { p = new int(ii); };
X(const X& obj) { this->p = new int(*(obj.p)); };
// X(X&& obj) { this->p = new int(*(obj.p)); delete obj.p; obj.p=nullptr;
};
X f5() {
return X(5);
}
int main() {
f5() = X(33);
system("pause");
}
解决方案
f5() = X(33);
将调用赋值运算符,因为那里已经存在 X 对象。这是一个任务,而不是一个结构。在你有一个移动构造函数之前,它调用了一个自动生成的赋值运算符。
现在,编译器不愿意(好吧,禁止)生成默认赋值运算符,因为您实现了移动构造函数。逻辑是,你可能更了解你的类型,所以它会让你实现
X &X::operator =(const X &)
推荐阅读
- cmake - CMake:将 add_subproject 与使用 Include 的库一起使用会导致错误的相对路径
- c++ - 特征懒惰评估和临时:一些案例研究
- jestjs - React 酶 + jest 如何测试 onSubmit
- testing - CMake/CTest - 并行执行进程作为测试
- c# - OData 无法使用构造函数序列化模型
- python - 2 opt swap算法复杂度
- python - 使用 Python 进行字符串匹配的模拟退火
- javascript - 如何在 VS Code 中返回旧的语法突出显示行为?
- java - Testcontainers - 容器正确启动,但 Junit 测试未在 Windows 上启动(可能自 1909 年更新以来)
- java - 为什么创建多个 ObjectMapper 实例不需要太多时间?