C ++ * this的值类别是什么?

时间:2015-07-11 21:59:53

标签: c++ c++11 rvalue this-pointer

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()

1 个答案:

答案 0 :(得分:4)

来自[basic.lval]:

  

左值(所谓的历史,因为左值可能出现在作业的左侧)   表达式)指定一个函数或一个对象。 [例如:如果E是指针类型的表达式,那么   *E是一个左值表达式,引用E指向的对象或函数。另一个例子,   调用返回类型为左值引用的函数的结果是左值。 -end example]

来自[expr.unary.op]:

  

一元*运算符执行间接:应用它的表达式应该是指向它的指针   对象类型或指向函数类型的指针,结果是引用对象或函数的左值   表达点指向的地方。

取消引用指针是左值。所以*this是左值。

或者,任何不是左值的东西都是右值。右值是:

  

rvalue(历史上所谓的,因为rvalues可能出现在赋值的右侧   表达式)是xvalue,临时对象(12.2)或其子对象,或者是不相关的值   用一个物体。

*this绝对不是那些东西。