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
相关产品推荐
相关产品推荐

