You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移动赋值中*arg=nullptr报错,直接访问arg.p正常的原因

问题原因解析

核心差异在于重载的operator*返回值类型以及C++中左值/右值的规则:

  1. 关于*arg = nullptr;编译错误

    • 假设你的operator*是按值返回(比如int* operator*()),那么*arg的计算结果是一个临时对象(右值)。C++的赋值运算符=要求左操作数是可修改的左值,右值无法被赋值,因此会触发“left operand must be l-value”错误。
    • 如果要让*arg = nullptr;合法,需要将operator*修改为返回左值引用,比如int*& operator*(),这样*arg就会成为指向arg.p的左值引用,允许赋值操作。
  2. 关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:40:53