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

Tho*_*eod 4 c++ rvalue this-pointer c++11

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)();
}
Run Code Online (Sandbox Code Playgroud)

输出:

lvalue operator()
lvalue operator()
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 5

来自 [basic.lval]:

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

来自 [expr.unary.op]:

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

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

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

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

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