返回引用会延长其生命周期吗?

3
据我所知,在下面的代码中,引用ro1的生命周期被延长到作用域结束(函数g()):
class Some {
  // Implementation here
};
Some f() {
  return Some(/* constructor parameters here*/);
}
void g() {
  Some&& ro1 = f();
  // ro1 lives till the end of this function
}

这个引用会如何返回?对象是否仍然存在于 g1() 中,还是在从 h() 退出时被销毁?
Some&& h() {
  Some&& ro1 = f();
  // Code skipped here
  return std::forward<Some>(ro1);
}

void g1() {
  Some&& ro2 = h();
  // Is ro2 still refering to a valid object?
}

你的第二个代码片段没有生命周期延长。 - Jarod42
1
如果是 std::forward<T>,那么可以期望进行移动构造。但在你的第二个片段中,由于它是一个 std::forward<T&&>,因此它避免了任何构造并留下了悬空引用。 - TheWaterProgrammer
g 返回本地临时变量时,它将被销毁,你会得到一个悬空引用。此外,我认为引用扩展仅适用于 const 引用而不是右值引用 - 我错过了什么吗?在 C++1z 中是否有所改变? - Richard Critten
1个回答

5

返回这个引用会怎样?对象是否仍然在g1()中存在?

不会。生命周期延长只会发生一次。从f()返回的临时对象绑定到引用ro1,它的生命周期为该引用的生命周期延长。 ro1的生命周期在h()结束时结束,因此在g1()中使用ro2是一种悬挂引用。

为了使其工作,您需要处理值:

Some h() {
  Some ro1 = f();
  // Code skipped here
  return ro1;
}

请注意,这里仍适用RVO(返回值优化)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接