C ++标准的9.3.2.1节规定:
在非静态(9.3)成员函数的主体中,关键字是 一个prvalue表达式,其值是对象的地址 调用该函数。这个类型在一个成员函数中 X类是X *。如果成员函数声明为const,则为 这是const X *,如果成员函数声明为volatile,则 这个类型是volatile X *,如果声明了成员函数 const volatile,这个类型是const volatile X *。
因此,如果this
是prvalue,那么*this
的值类别是什么?以下表明,即使对象是右值,*this
也始终是左值。它是否正确?如果可能,请参阅标准。
struct F;
struct test
{
void operator()(F &&) { std::cout << "rvalue operator()" << std::endl; }
void operator()(F const &&) { std::cout << "const rvalue operator()" << std::endl; }
void operator()(F &) { std::cout << "lvalue operator()" << std::endl; }
void operator()(F const &) { std::cout << "const lvalue operator()" << std::endl; }
};
struct F
{
void operator ()()
{
struct test t;
t(*this);
}
};
int main()
{
struct F f;
f();
std::move(f)();
}
输出:
lvalue operator()
lvalue operator()
答案 0 :(得分:4)
来自[basic.lval]:
左值(所谓的历史,因为左值可能出现在作业的左侧) 表达式)指定一个函数或一个对象。 [例如:如果
E
是指针类型的表达式,那么*E
是一个左值表达式,引用E
指向的对象或函数。另一个例子, 调用返回类型为左值引用的函数的结果是左值。 -end example]
来自[expr.unary.op]:
一元
*
运算符执行间接:应用它的表达式应该是指向它的指针 对象类型或指向函数类型的指针,结果是引用对象或函数的左值 表达点指向的地方。
取消引用指针是左值。所以*this
是左值。
或者,任何不是左值的东西都是右值。右值是:
rvalue(历史上所谓的,因为rvalues可能出现在赋值的右侧 表达式)是xvalue,临时对象(12.2)或其子对象,或者是不相关的值 用一个物体。
*this
绝对不是那些东西。