为什么函数调用是xvalue(如果返回类型是rvalue)?

时间:2019-05-24 10:19:37

标签: c++ c++11 xvalue prvalue

假设我们有一个功能:

struct A {
    int m;
};

A&& f();

据我所知:

f();
f().m; 

都是xvalue。但为什么?他们为什么不prvalue?我有点困惑。

1 个答案:

答案 0 :(得分:2)

因为您是从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继承了较早的子表达式的值类别,这对于成员访问是正常的。