Почему вызов функции является 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 наследует категорию значений предыдущего под-выражения, как обычно для доступа к элементу.

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