用于C++中成员函数的const&,&和&&说明符

joh*_*zac 54 c++ const c++11

最近我正在阅读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标准的此功能的更多信息,您可以阅读这篇文章什么是"*这个的右值参考"?

  • 如果它有帮助,我喜欢将这些限定符视为应用于作为方法的第一个参数"秘密"传入的`*this`对象. (8认同)
  • `const&`和`&`表示它们将用于`const`和非`constst`*lvalue*.`&&`将仅用于右值,不一定是参考. (4认同)
  • 实际上,`const&`几乎可以绑定任何东西,甚至是rvalue.适用于任何参数绑定的类似规则 - "const T&"有点特殊 - 它可以绑定到任何非易失性的IIRC (3认同)
  • @john_zac你说他们为什么这样做是对的,不,编译器不能引入`std :: move`s,因为它认为合适.它可以打破类的不变量,RAII语义等.标准中允许类似的东西的唯一位置是`return`,其中首先尝试返回rvalue. (3认同)

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)