gpt4 book ai didi

c++ - 当需要移动赋值运算符时,为什么编译器要寻找复制赋值运算符?

转载 作者:行者123 更新时间:2023-12-02 01:51:25 26 4
gpt4 key购买 nike

#include <utility>

class A {
int* ptr;
public:
A() {
ptr = new int[10];
}

A(A&& rhs) {
this->ptr = rhs.ptr;
rhs.ptr = nullptr;
}

~A() {
if (ptr) delete[] ptr;
}
};

int main() {
A a1;
A a2;
a2 = std::move(a1);
}

GCC 11 提示复制赋值运算符被删除:

<source>: In function 'int main()':
<source>:23:22: error: use of deleted function 'constexpr A& A::operator=(const A&)'
23 | a2 = std::move(a1);
| ^
<source>:3:7: note: 'constexpr A& A::operator=(const A&)' is implicitly declared as deleted because 'A' declares a move constructor or move assignment operator
3 | class A {
| ^
Compiler returned: 1

然后,在我定义了移动赋值运算符(不是复制赋值运算符)之后,它编译得很好。那么,这意味着编译器确实正在寻找移动赋值运算符,这正是我所期望的。我不明白为什么当隐式删除移动赋值运算符时,编译器会寻找复制赋值运算符。任何想法?或者这只是编译器发出的错误消息?

最佳答案

你的解释并不完全正确。编译器并没有专门寻找 operator=(A&&)。它只是寻找可以为该分配调用的任何operator=

现在,移动赋值运算符 operator=(A&&) 根本不存在。但是,复制赋值运算符 operator=(const A&) 确实存在,但它被定义为已删除。

因此,复制赋值运算符是唯一可用于该赋值的运算符(因为常量左值引用可以绑定(bind)右值)。编译器尝试使用它,但发现它被删除,从而触发编译错误。

关于c++ - 当需要移动赋值运算符时,为什么编译器要寻找复制赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70299514/

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