返回右值引用和临时物化

Returning Rvalue Reference and Temporary Materialization

考虑以下函数。我想要 C++17.

的答案
MyClass&& func() {
  return MyClass{};
}

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

问题:

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

func() 是一个 xvalue,因为该语言的规则之一是,如果一个函数被声明为具有 return 类型的对象右值引用,则表达式包含调用该对象函数是一个 xvalue 。 (C++17 expr.call/11).

Temporary materialization 发生在引用绑定到纯右值的任何时候。

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

The lifetime of a temporary bound to the returned value in a function return statement is not extended; the temporary is destroyed at the end of the full-expression in the return statement.

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