在所需的最少代码片段中,在移动分配中,为什么注释行
*arg = nullptr;
非法而arg.p = nullptr;
可以?如果我理解正确的话,两者都在修改右值,但在编译时 *arg = nullptr;
会产生错误:
左操作数必须是左值
由于运算符重载,我希望
*arg
能够提供对 arg
的 p
的访问。
#include <iostream>
using namespace std;
class Ptr {
public:
Ptr(double arg) :p{ new double(arg) } {}
// copy constructor
Ptr(const Ptr& arg) {
p = new double(*(*arg));
}
// move assignment
Ptr& operator=(Ptr&& arg) {
delete p;
p = *arg;
cout << "move type of *arg " << typeid(*arg).name() << endl;
arg.p = nullptr;
//*arg = nullptr; // illegal
return *this;
}
// operator *, allows to read and write *p
double* operator*() {
return p;
}
const double* operator*() const {
return p;
}
~Ptr() {
delete p;
}
private:
double* p;
};
Ptr copy(Ptr a) { return a; }
int main() {
Ptr pt{ 2 };
Ptr pt2{ 3 };
pt2 = copy(pt);
return 0;
}
尝试过 chatGpt 寻求帮助,但是,它认为我正在尝试将指针分配给 double ,这显然不是这种情况,因为如果我这样做
cout << "type of *arg " << typeid(*arg).name()<<endl;
就会看到指针类型。