常量和放大器; ,&和&& C ++中成员函数的说明符

时间:2015-01-21 12:01:51

标签: c++ c++11 const

最近我正在阅读API of boost::optional,并且发现了以下几行:

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

我还编写了自己的程序,将成员函数定义为const&,&和&& (请注意,我不是在谈论返回类型,而是在分号之前的说明符)并且它们似乎工作正常。

我知道声明一个成员函数const意味着什么,但任何人都可以解释声明它是什么意思const&,&和&&。

2 个答案:

答案 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"
}