C + + 中成员函数的 const & 、 & 和 & & 说明符

最近,我在阅读 boost::optional的空气污染指数的时候,发现了这样一行字:

T const& operator *() const& ;
T&       operator *() & ;
T&&      operator *() && ;

我还编写了自己的程序,将成员函数定义为 const & ,& 和 & & (注意,我不是在说返回类型,而是分号前面的说明符) ,它们似乎工作得很好。

我知道声明一个成员函数 const 意味着什么,但是谁能解释一下声明它 const & ,& 和 & & 意味着什么。

14399 次浏览

const&意味着,此重载将仅用于 const、 non-const 和 lvalue 对象。

const A a = A();
*a;

&意味着此重载将仅用于非常数对象。

A a;
*a;

&&意味着此重载将仅用于右值对象。

*A();

关于 C + + 11标准的这个特性的更多信息,你可以阅读这篇文章 什么是“ * this 的 rvalue 引用”?

它是一个成员函数 ref 限定符; 它是 C + + 11中添加的特性之一。通过指定一个函数 ref-qualfier (一些细节) ,可以根据隐式 this对象参数是左值还是右值来重载非静态成员函数。

要为非静态成员函数指定 ref 限定符,可以使用 &&&限定函数。

#include <iostream>
struct myStruct {
void func() & { std::cout << "lvalue\n"; }
void func() &&{ std::cout << "rvalue\n"; }
};
 

int main(){
myStruct s;
s.func();            // prints "lvalue"
std::move(s).func(); // prints "rvalue"
myStruct().func();   // prints "rvalue"
}