Почему вызов функции является xvalue (если возвращаемый тип является rvalue)?
Допустим, у нас есть функция:
struct A {
int m;
};
A&& f();
Насколько я знаю выражения:
f();
f().m;
оба xvalue. Но почему? Почему они не prvalue? Я немного смущен.
1 ответ
Потому что вы возвращаетесь по ссылке, а не по значению, из f
, Это подразумевает, что A
имеет срок службы дольше, чем f()
например,
A&& f()
{
static A res;
return std::move(res);
}
или же
A global;
A&& f()
{
return std::move(global);
}
Но нет
A&& f()
{
return {}; // dangling reference
}
В f().m;
, использование m
наследует категорию значений предыдущего под-выражения, как обычно для доступа к элементу.