4

C++ 标准的第 9.3.2.1 节规定:

在非静态 (9.3) 成员函数的主体中,关键字 this 是一个纯右值表达式,其值是调用该函数的对象的地址。类 X 的成员函数中 this 的类型是 X*。如果成员函数声明为 const,则 this 的类型为 const X*,如果成员函数声明为 volatile,则 this 的类型为 volatile X*,如果成员函数声明为 const volatile,则 this 的类型为 const挥发性 X*。

那么如果this是纯右值,它的值类别是*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()
4

1 回答 1

5

来自 [basic.lval]:

左值(历史上称为左值,因为左值可能出现在赋值表达式的左侧)指定函数或对象。[ 例子: ifE是一个指针类型的表达式,then *E是一个左值表达式,指的是指向的对象或函数E。作为另一个示例,调用返回类型为左值引用的函数的结果是左值。—结束示例]

并来自 [expr.unary.op]:

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

取消引用指针是一个左值。*this左值也是如此。

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

右值(历史上称为右值,因为右值可能出现在赋值表达式的右侧)是一个 xvalue、一个临时对象 (12.2) 或其子对象,或者一个与对象无关的值。

而且*this绝对不是这些东西。

于 2015-07-11T22:05:15.090 回答