返回右值参考和临时物化

问题描述 投票:2回答:1

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

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

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

问题:

  1. 表达式func()是一个xvalue吗?为什么?
  2. 为什么myRef是悬挂的参考?或者,更具体地说,为什么func()返回一个悬空参考?返回右值引用是否会导致临时实现,并延长临时对象的生存期?
c++ return c++17 rvalue-reference xvalue
1个回答
3
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.