【问题标题】:Prolonging life of a temporary object using const reference使用 const 引用延长临时对象的寿命
【发布时间】:2017-03-13 12:32:45
【问题描述】:

我需要对 const 引用做一些说明。 来自this link:

const Foo &myFoo = FuncBar();

const 引用延长了本地对象的寿命。但是当我检查 this link 尽管他们使用了 const 引用时

Sandbox(const string& n) : member(n) {}

字符串“四”的生命周期没有增加。

Sandbox sandbox(string("four"));

他们用了这个句子

只有本地 const 引用才能延长生命周期。

那么在第二个链接中,字符串“four”不是主函数本地的,常量引用n不应该延长它的寿命吗?
那么为什么第二个环节的寿命没有延长呢?

【问题讨论】:

  • “局部”,如“局部变量”。
  • 您的问题现在并不是真正独立的,因为“四”等的定义隐藏在链接后面。可以edit里面的相关部分吗?
  • 我的意思是,在第一个链接中,字符串“four”不是 main 函数的本地字符串,所以变量 n 是对“four”的本地 const 引用?
  • 不同之处在于类中的 const 在类中,而在其他代码中它在函数之外 - 如果您复制您要参考的代码,您的问题会更清楚跨度>
  • 第二个是类构造函数,它不是函数,因此没有 const 引用的局部变量绑定到 temp var。

标签: c++ pass-by-reference lifetime temporary-objects reference-binding


【解决方案1】:

您提到的两个链接在某种意义上是不同的,一个显示使用本地 const 引用,另一个显示使用类成员 const 引用。

当我们创建本地 const 引用并引用一个临时对象时,在此编译器中将临时对象的生命周期延长到本地 const 引用的范围。

指向临时的类成员 const 引用将导致意外结果,因为临时对象的生命周期不会超出为初始化类成员引用而调用的构造函数。正如其中一个答案中所解释的那样,临时文件只会在构造函数完成之前存活。

引用答案: Does a const reference prolong the life of a temporary?

生命周期延长不能通过函数参数传递。 §12.2/5 [class.temporary]:

第二个上下文是引用绑定到临时的。引用绑定到的临时对象或作为临时对象绑定的子对象的完整对象的临时对象将在引用的生命周期内持续存在,除非下面指定。在构造函数的 ctor-initializer (§12.6.2 [class.base.init]) 中,临时绑定到引用成员会一直存在,直到构造函数退出。在函数调用(第 5.2.2 节 [expr.call])中临时绑定到引用参数会一直持续到包含调用的完整表达式完成为止。

如果您正确分析它,您将意识到在这两种情况下,临时的生命周期都会延长,直到初始化引用的范围有效。一旦引用的范围超出范围,临时就变得无效。

对于本地 const 引用,作用域在函数内部,从那里它被初始化为临时值。 对于类成员 const 引用,作用域是构造函数,它被初始化为临时变量。

您还应该阅读这篇 GOTW 文章: https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2014-07-04
    • 2016-01-12
    相关资源
    最近更新 更多