C++ 康斯特&;及&;C++;

C++ 康斯特&;及&;C++;,c++,c++11,constants,C++,C++11,Constants,最近,我在通读这本书时,遇到了这样一句话: T const& operator *() const& ; T& operator *() & ; T&& operator *() && ; 我还编写了自己的程序,将成员函数定义为const&、&和&&(注意,我不是说返回类型,而是在分号之前的说明符),它们似乎工作正常 我知道声明一个成员函数const意味着什么,但是谁能解释一下声明它const&,and&&意

最近,我在通读这本书时,遇到了这样一句话:

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


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

const&
意味着这个重载将只用于const、non-const和左值对象

const A a = A();
*a;
*A();
&
表示此重载将仅用于非常量对象

A a;
*a;
&&
表示此重载将仅用于右值对象

const A a = A();
*a;
*A();

有关C++11标准的此功能的更多信息,请阅读本文

这是成员函数ref限定符,它是C++11中添加的功能之一。通过指定函数ref限定符(),可以根据隐式
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"
}
#包括
结构myStruct{

void func()&{std::cout如果有帮助,我喜欢将这些限定符视为应用于“秘密”的
*这个
对象作为方法的第一个参数传入。
const&
&
意味着它们将用于
const
和非
const
左值。
&
将仅用于右值,而不一定是引用。实际上,
const&
可以绑定到几乎任何东西,甚至是右值。类似于apply到任何参数的绑定-
const T&
有点特殊-它可以绑定到任何不是
易失性的
IIRC@john_zac他们这样做的原因你是对的,不,编译器不能在它认为合适的时候引入
std::move
s。它可能会破坏类的不变量、RAII语义等。这是标准允许类似的操作是
return
,其中首先尝试以右值返回。@john_zac,正如您所问,这些操作不是非常“必要”。但它们提供了某些可选的优化。您只需使用
t运算符*()
-这会编译,但会产生一些奇怪的后果-
*p=x
不会做您期望它做的事情。我认为重要的是返回类型-我们需要具有不同返回类型的多个重载。一旦您理解了不同返回类型的可取性,那么您也会发现我们需要在端点用于控制每个调用使用的重载(以及相应的返回类型)。