C++运算符重载中ref-qualifier与cv-qualifier支持右值赋值的原因
C++成员函数ref-qualifier匹配规则解释
这一现象完全遵循C++标准中带ref-qualifier(引用限定符)的成员函数的重载决议规则,核心逻辑可以拆解为以下几点:
基础规则
- 引用限定符的作用是约束成员函数所绑定的
this对象的值类别:- 加
&限定的成员函数,只能被左值对象调用,因为非const左值引用无法绑定到右值 - 加
&&限定的成员函数,只能被右值对象调用
- 加
- 如果成员函数不带任何引用限定符,默认允许左值、右值对象调用
- const左值引用(
const &)是特殊的:它可以合法绑定到右值对象,因此带const &限定的成员函数同时支持左值、右值(包括const右值)对象调用 - 重载决议时,对右值对象来说,
&&、const &&限定的重载优先级高于const &的重载
对应示例逐一解释
- 仅加
&限定的operator+=报错
你只声明了&限定的重载,而foo()是临时对象,属于右值,无法绑定到非const左值引用,没有匹配的重载,自然编译报错。 - 加
&&重载后右值调用正常
右值对象优先匹配&&限定的重载,所以调用到新增的右值版本,输出13。 - 加
const &重载后右值可以调用
右值虽然不能匹配&的版本,但可以绑定到const左值引用,所以会匹配const &的重载,输出14。 - 删除
const &&重载后右值调用再次报错
重载决议时,右值对象匹配const &&的优先级高于const &,你显式删除了const &&的重载,所以编译器会直接报调用已删除函数的错误,从而彻底禁止右值调用。
内容的提问来源于stack exchange,提问作者mattsson
相关产品推荐
相关产品推荐

