c++ - 延长临时工生命周期的理由是什么?

标签 c++ language-design

在 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/

相关文章:

c++ - 在 Linux 上原子写入文件

具有多个返回参数的 C# 方法

c# - CS0106 编译错误 : readonly property and getter

scala - 随着时间的推移,Scala 删除了哪些语法选项/语言特性(以及为什么)?

python - 如何避免将循环索引泄漏到 python 2.x 的命名空间中?

c++ - 包含包装类型和类型本身的 union 是否有任何保证?

c++ - 程序输出仅在多线程程序中有时出现

c++ - std::numeric_limits<double>::epsilon() 在 Visual C++ 2015 中未定义

c++ - Constexpr 函数返回 union 成员 : g++ vs. clang++ : no diagnostics vs. 错误

c++ - 为什么在 C/C++ 中可以多次包含一个 header ?