返回右值引用和临时物化

zem*_*eht 3 c++ return rvalue-reference xvalue c++17

考虑以下函数。我想要C++17的答案。

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

int main() {
  MyClass&& myRef = func();
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 表达式是func()x 值吗?为什么?
  2. 为什么是myRef悬空引用?或者,更具体地说,为什么要func()返回悬空引用?返回右值引用不会导致临时物化并延长临时对象的生命周期吗?

M.M*_*M.M 6

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

每当引用绑定到纯右值时,就会发生临时具体化。

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

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

因此,当语句完成时,由 实现的临时对象func() 将被销毁return,并且没有扩展。