Недавно, читая блог об универсальной ссылке Скотта Мейерса, я наткнулся на утверждение, что «если вы можете взять адрес выражения, выражение является lvalue». но правда ли это
Предположим, у меня есть следующий код
class Test
{
};
int main()
{
std::cout << "Address is " << &(Test()) << std::endl;
Test() = Test();
Test&& t = Test();
return 0;
}
В приведенном выше случае Test () является временным, то есть rvalue, и я могу взять его адрес (с gcc мы можем использовать -fpremissive, а с msvc он будет компилироваться напрямую), поэтому с этим мы можем сказать, что это lvalue, а также bcoz мы можем сделать Test() = Test(), но поскольку мы можем использовать ссылку rvalue, это должно быть rvalue.
Так почему же мы всегда говорим, что если мы можем взять адрес переменной, то это lvalue?