Почему вызов функции является xvalue (если возвращаемый тип является rvalue)? - PullRequest
0 голосов
/ 24 мая 2019

Допустим, у нас есть функция:

struct A {
    int m;
};

A&& f();

Насколько я знаю выражения:

f();
f().m; 

оба xvalue. Но почему? Почему они не prvalue? Я немного смущен.

1 Ответ

2 голосов
/ 24 мая 2019

Поскольку вы возвращаетесь по ссылке, а не по значению, из 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
}

In f().m;, использование m наследует категорию значений предыдущего под-выражения, как обычно для доступа к элементу.

...