您引用的两个链接在某种意义上是不同的,一个链接表示使用本地const引用,而另一个链接表示使用类成员const引用。
当我们创建局部常量引用并引用一个临时对象时,在这个编译器中会延长临时对象的生命周期,直到局部常量引用的范围。
指向临时对象的类成员 const 引用将导致意外结果,因为临时对象的生命周期不会超出为初始化类成员引用而调用的构造函数。正如在其中一个答案中所解释的那样,临时对象只会在构造函数完成之前存活。
引用以下答案:常量引用是否会延长临时对象的寿命?
生命周期扩展不能通过函数参数传递。§12.2/5 [class.temporary]:
第二个上下文是引用绑定到临时对象时。引用绑定到的临时对象或作为临时对象绑定到的子对象的完整对象的临时对象在引用的生命周期内持续存在,除非在下面指定。临时绑定到构造函数的 ctor-initializer (§12.6.2 [class.base.init]) 中的引用成员会一直存在,直到构造函数退出。函数调用(第 5.2.2 节 [expr.call])中引用参数的临时绑定一直存在,直到包含调用的完整表达式完成。
如果正确分析它,您将意识到在两种情况下,临时生命的寿命都会延长,直到初始化引用的范围有效为止。一旦引用的范围超出范围,临时文件就无效了。
对于局部常量引用,作用域在一个函数内部,从那里它被初始化为一个临时变量。对于类成员 const 引用,作用域是构造函数,它被初始化为临时值。
您还应该阅读这篇 GOTW 文章:https ://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句