在阅读http://en.cppreference.com/w/cpp/language/member_functions时,我遇到了一些我以前没有见过的东西:
lvalue/rvalue Ref-qualified member functions
。它们的目的是什么?lvalue/rvalue Ref-qualified member functions
。它们的目的是什么?请看下面的内容:
在重载决议时,对于类X的非静态cv限定成员函数,如果它没有ref-qualifiers或者有左值引用限定符,那么它被视为一个接受隐式参数类型为cv限定的X的左值引用的函数。否则(如果它具有右值引用限定符),它被视为一个接受隐式参数类型为cv限定的X的右值引用的函数。
#include <iostream>
struct S {
void f() & { std::cout << "lvalue\n"; }
void f() &&{ std::cout << "rvalue\n"; }
};
int main(){
S s;
s.f(); // prints "lvalue"
std::move(s).f(); // prints "rvalue"
S().f(); // prints "rvalue"
}
因此,在重载决议期间,如果调用程序对象是 lvalue
,则编译器会查找带有 & 限定符的函数,如果调用程序对象是 rvalue
,则编译器会查找带有 && 限定符的函数。
S
的f()
打印“lvalue”,而rvalueS
的f()
打印“rvalue”的原因。Ref-qualifiers 是在void f()
之后的&
(lvalue)和&&
(rvalue)。 - sunny moon