Раздел 9.3.2.1 из C++ стандартных состояний:C++ что такое категория значений * this?
В теле функции члена нестатический (9.3), ключевое слово это prvalue выражение, значение которого является адрес объекта для который вызывается функцией. Тип этого в функции-члене от класса X равен X *. Если функция-член объявлена const, тип это const X *, если функция-член объявлена изменчивой, то тип этого параметра является изменчивым X *, а если объявлена функция-член const volatile, тип это const volatile 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()
Результат разыменования указателя всегда равен lvalue.В C++ нет указателей xvalue. –
@KerrekSB - это следствие правила «если оно имеет имя»? –
@AmiTavory: Не существует такого правила. Это скорее правило большого пальца, но это не формальная спецификация. Это просто потому, что язык так говорит. По сути, как только вы сможете получить адрес чего-то, у вас есть lvalue. Обратите внимание, что вы не можете использовать адрес rvalues встроенных типов. –