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

C++类中赋值运算符后的&有何作用?带&=delete语法解析

赋值运算符后的后置&是什么作用?

那个后置的&是C++11引入的成员函数引用限定符,核心作用是限制成员函数的调用对象类型:

  • 带后置&的成员函数,只能被左值对象调用;
  • 对应的还有后置&&,表示只能被右值对象(比如临时对象)调用。

为什么你的例子里去掉&表现一致?

因为当前代码中赋值运算符本身被= delete标记为删除,不管左值还是右值调用都会触发编译错误。但如果换个场景,差异就会立刻显现:
比如假设类的赋值运算符没有被删除,只是加了后置&,那么像CustomClass{} = cc;这种用右值临时对象赋值的语句,会直接因为引用限定符的限制编译失败;但如果去掉&,这条语句就能正常通过编译(只要赋值逻辑合法)。

结合你的代码场景

你的类把所有拷贝/移动构造、赋值都标记为删除,目的是让类完全不可拷贝移动。加上后置&是一种更严格的约束:它在重载决议阶段就直接排除了右值对象调用赋值运算符的可能,从根源上杜绝了任何形式的赋值尝试,比单纯删除函数的限制更彻底。

举个直观的对比例子:

class Test {
public:
    Test& operator=(const Test&) & {
        return *this;
    }
};

int main() {
    Test a, b;
    a = b; // 合法,a是左值,符合&限定
    Test{} = a; // 编译错误!临时对象是右值,无法调用带&限定的赋值运算符
}

内容的提问来源于stack exchange,提问作者LeviX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:20:43