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
不会做您期望它做的事情。我认为重要的是返回类型-我们需要具有不同返回类型的多个重载。一旦您理解了不同返回类型的可取性,那么您也会发现我们需要在端点用于控制每个调用使用的重载(以及相应的返回类型)。