【问题标题】:Returning Rvalue Reference and Temporary Materialization返回右值引用和临时实现
【发布时间】:2020-06-10 05:07:56
【问题描述】:

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

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

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

问题:

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

【问题讨论】:

  • "表达式 func() 是 xvalue 吗?为什么?" ...为什么不是?

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    相关资源
    最近更新 更多