在 C++ 中,可以通过将临时值绑定(bind)到引用来延长其生命周期:
Foo make_foo();
{
Foo const & r1 = make_foo();
Foo && r2 = make_foo();
// ...
} // both objects are destroyed here
为什么允许这样做?这解决了什么问题?
我在 Design and Evolution 中找不到对此的解释(例如 6.3.2:临时生命周期)。我也找不到任何关于此的先前问题(this one 最接近)。
此功能有些不直观,并且具有微妙的故障模式。例如:
Foo const & id(Foo const & x) { return x; } // looks like a fine function...
Foo const & r3 = id(make_foo()); // ... but causes a terrible error!
为什么可以如此轻易地、默默地滥用语言的一部分?
更新:这一点可能很微妙,需要澄清一下:我不反对使用“引用绑定(bind)到临时对象”的规则。这一切都很好,并且允许我们在绑定(bind)到引用时使用隐式转换。我要问的是为什么临时的 lifetime 会受到影响。说白了,我可以声称现有的“直到完整表达式结束的生命周期”规则已经涵盖了使用临时参数调用函数的常见用例。
最佳答案
简单的答案是您需要能够将临时值与 const 引用绑定(bind),没有该功能将需要大量代码重复,函数将 const&
用于左值或值参数或右值参数的按值。
一旦你需要,语言需要定义一些语义,以保证临时的生命周期至少与引用的生命周期一样长。
一旦您接受引用可以在一个上下文中绑定(bind)到右值,为了保持一致性,您可能希望扩展规则以允许在其他上下文中进行相同的绑定(bind),并且语义实际上是相同的。临时生命周期会延长,直到引用消失(无论是函数参数还是局部变量)。
替代方法是允许在某些上下文(函数调用)但不是所有上下文(本地引用)中绑定(bind)的规则,或者允许两者并在后一种情况下始终创建悬空引用的规则。
从答案中删除了引号,留在这里以便评论仍然有意义:
如果你看一下标准中的措辞,会有一些关于这种预期用法的提示:
12.2/5 [middle of the paragraph] [...] A temporary bound to a reference parameter in a function call (5.2.2) persists until the completion of the full expression containing the call. [...]
关于c++ - 延长临时工生命周期的理由是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20546981/