最近我正在阅读APIboost::optional
并且遇到了以下问题:
T const& operator *() const& ;
T& operator *() & ;
T&& operator *() && ;
Run Code Online (Sandbox Code Playgroud)
我还编写了自己的程序,将成员函数定义为const&,&和&&(请注意,我不是在谈论返回类型,而是在分号之前的说明符),它们似乎工作正常.
我知道声明一个成员函数const意味着什么,但任何人都可以解释它是什么意思来声明它const&,&和&&.
For*_*veR 39
const&
意味着,此重载仅用于const,非const和Lvalue对象.
const A a = A();
*a;
Run Code Online (Sandbox Code Playgroud)
&
意味着,此重载将仅用于非const对象.
A a;
*a;
Run Code Online (Sandbox Code Playgroud)
&&
意味着,此重载仅用于右值对象.
*A();
Run Code Online (Sandbox Code Playgroud)
有关C++ 11标准的此功能的更多信息,您可以阅读这篇文章什么是"*这个的右值参考"?
Alp*_*per 35
它是成员函数ref-qualifiers,它是C++ 11中添加的功能之一.this
通过指定函数ref-qualifier(一些细节),可以基于隐式对象参数是左值还是右值来重载非静态成员函数.
要指定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"
}
Run Code Online (Sandbox Code Playgroud)