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
безусловно, ничего из этого.