2

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

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

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

问题:

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

1 回答 1

3

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

每当引用绑定到纯右值时,都会发生临时实现。

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

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

因此,当语句完成时,具体化的临时对象func() 被销毁,没有扩展。return

于 2020-06-10T05:18:51.610 回答