c++ - 返回右值引用和临时物化

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

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

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

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

问题:

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

最佳答案

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

Temporary materialization任何时候引用绑定(bind)到纯右值时都会发生。

函数的结果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 语句完成时被销毁,没有扩展。

关于c++ - 返回右值引用和临时物化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62296253/

相关文章:

c++ - 从我自己的库调用时,伺服器没有 move 。阿杜诺

无法确定为什么程序的函数将数组返回给主程序

C API : why are functions using returnParameters with buffer + size instead of returning char*

c++ - 为什么在 std::optional 的某些实现中存在虚拟 union 成员?

c++ - 将 ISO8601 日期时间转换为另一个日期时间时区

c++ - 如何在同一行更改时间

c++ - 两个位置的 Clock() 返回相同数量的滴答声

c++ - MinGW gdb 在与 Eclipse CDT 一起使用时忽略断点

java - 返回 printf(),找不到符号

c++ - 如何明确重载具有std::size_t模板参数和具有范围枚举模板参数的函数?