最近我正在阅读API of boost::optional
,并且发现了以下几行:
T const& operator *() const& ;
T& operator *() & ;
T&& operator *() && ;
我还编写了自己的程序,将成员函数定义为const&,&和&& (请注意,我不是在谈论返回类型,而是在分号之前的说明符)并且它们似乎工作正常。
我知道声明一个成员函数const意味着什么,但任何人都可以解释声明它是什么意思const&,&和&&。
答案 0 :(得分:34)
const&
表示此重载仅用于const,非const和Lvalue对象。
const A a = A();
*a;
&
表示此重载仅用于非const对象。
A a;
*a;
&&
表示此重载仅用于右值对象。
*A();
有关C ++ 11标准此功能的更多信息,请阅读此文What is "rvalue reference for *this"?
答案 1 :(得分:31)
它是成员函数ref-qualifiers,它是C ++ 11中添加的功能之一。通过指定函数ref-qualifier(some details),可以根据隐式this
对象参数是左值还是右值来重载非静态成员函数。
要为非静态成员函数指定ref-qualifier,您可以使用&
或&&
限定该函数。
#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"
}