返回右值参考和临时实现

时间:2020-06-10 05:07:56

标签: c++ return c++17 rvalue-reference xvalue

请考虑以下功能。我想要 C ++ 17 的答案。

MyClass&& func() {
  return MyClass{};
}

int main() {
  MyClass&& myRef = func();
}

问题:

  1. 表达式func()是一个xvalue吗?为什么?
  2. 为什么myRef是悬挂的参考?或者,更具体地说,为什么func()返回一个悬空的引用?返回右值引用是否会导致临时物化并延长临时对象的寿命?

1 个答案:

答案 0 :(得分:3)

func()是一个xvalue,因为该语言的规则之一是,如果声明一个函数具有对对象的rvalue引用的返回类型,则由调用该函数组成的表达式就是一个xvalue。 (C ++ 17 expr.call/11)。

Temporary materialization会在引用绑定到prvalue时发生。

该函数的结果myRef,由prvalue func()初始化。但是,如果我们在class.temporary / 6中查阅生命周期延长规则,则它具有:

在函数return语句中临时绑定到返回值的生存期不会延长;临时变量会在return语句中的完整表达式结束时销毁。

因此,func()语句完成时(无扩展名),由return实现的临时对象将被销毁。