使用const引用延长临时对象的生命周期

时间:2017-03-13 12:32:45

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

我需要对const参考做一些澄清。 来自this link

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

const引用扩展了本地对象的生命周期。但是当我检查this link时,虽然他们使用了const引用

Sandbox sandbox(string("four"));
字符串“四”的生命周期没有增加。

n

他们使用了句子

  

只有本地const引用会延长使用寿命。   

然后在第二个链接中不是主函数本地的字符串“四”,并且const引用@api.multi def action_invoice_create( self, cr, uid, ids, wizard_brw, inv_brw, context=None): 不应该延长它的寿命吗?
那么为什么第二个环节的寿命不会延长呢?

1 个答案:

答案 0 :(得分:3)

你提到的两个链接是不同的,一个显示使用本地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引用,scope在函数内部,从初始化为temp。 对于类成员const引用,scope是构造函数,它被初始化为temp。

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