移动赋值中*arg=nullptr报错,直接访问arg.p正常的原因
问题原因解析
核心差异在于重载的operator*返回值类型以及C++中左值/右值的规则:
关于
*arg = nullptr;编译错误- 假设你的
operator*是按值返回(比如int* operator*()),那么*arg的计算结果是一个临时对象(右值)。C++的赋值运算符=要求左操作数是可修改的左值,右值无法被赋值,因此会触发“left operand must be l-value”错误。 - 如果要让
*arg = nullptr;合法,需要将operator*修改为返回左值引用,比如int*& operator*(),这样*arg就会成为指向arg.p的左值引用,允许赋值操作。
- 假设你的
关于
arg.p = nullptr;合法的原因- 即使
arg是移动赋值中的右值引用参数(绑定右值对象),成员访问运算符.允许对右值对象的非const成员进行直接修改。arg.p代表的是对象内部的成员变量本身,属于左值,因此可以直接被赋值。
- 即使
举个简化的代码示例:
class MySmartPtr { public: int* p = nullptr; // 按值返回的operator*,导致*arg是右值 int* operator*() { return p; } // 若改为返回左值引用,*arg即可作为左值赋值 // int*& operator*() { return p; } }; MySmartPtr& MySmartPtr::operator=(MySmartPtr&& arg) { // *arg = nullptr; // 编译报错:左操作数不是左值 arg.p = nullptr; // 编译通过,arg.p是左值 return *this; }
内容的提问来源于stack exchange,提问作者Bruno Mraz
相关产品推荐
相关产品推荐

