C++, что такое категория значений *this?

Раздел 9.3.2.1 стандарта C++ гласит:

В теле нестатической (9.3) функции-члена ключевое слово this является выражением prvalue, значением которого является адрес объекта, для которого вызывается функция. Тип этого в функции-члене класса X - X*. Если функция-член объявляется как const, типом этого является const X*, если функция-член объявляется как volatile, типом этого является volatile X*, а если функция-член объявляется как const volatile, тип этого является const летучий X*.

Так что если this является prvalue, что такое категория стоимости *this? Следующее предполагает, что даже когда объект является rvalue, *this всегда lvalue. Это правильно? Пожалуйста, обратитесь к стандарту, если это возможно.

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 ответ

Решение

Из [basic.lval]:

Lvalue (исторически так называемое lvalue, которое может появляться в левой части выражения присваивания) обозначает функцию или объект. [Пример: если E является выражением типа указателя, то *E является выражением lvalue, относящимся к объекту или функции, к которой E точки. В качестве другого примера, результатом вызова функции, тип возвращаемой которой является ссылкой на lvalue, является lvalue. - конец примера]

И из [expr.unary.op]:

Одинарный * Оператор выполняет косвенное обращение: выражение, к которому оно применяется, должно быть указателем на тип объекта или указателем на тип функции, а результатом является lvalue, указывающее на объект или функцию, на которые указывает выражение.

Разыменование указателя является lvalue. Так *this это значение.

Кроме того, все, что не является lvalue, является rvalue. Значение это:

Значение r (исторически так называемое, потому что значения r могут появляться в правой части выражения присваивания) представляет собой значение x, временный объект (12.2) или его подобъект или значение, которое не связано с объектом.

А также *this безусловно, ничего из этого.

Другие вопросы по тегам