0

我需要一些关于const引用的说明。 从this link
使用const引用延长临时对象的生命

const Foo &myFoo = FuncBar(); 

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

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

串的一生“四个一”并没有增加。

Sandbox sandbox(string("four")); 

他们用了一句

只有本地常量引用延长使用寿命。

然后在第二个环节是不是字符串“四个一”本地的主要功能,不能使用const参考n延长其寿命?
那么,为什么生命不会在第二个环节中延长呢?

+4

“本地”,如 “*局部变量*”。 –

+3

你的问题现在不是真正独立,因为“四”等的定义被隐藏在链接后面。你可以编辑相关部分吗? – Angew

+0

我的意思是在第一个链接中不是主函数本地的字符串“four”,所以变量n是对“four”的本地const引用? – user3762146

回答

2

您引用的两个链接在某种意义上是不同的,即表示使用本地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引用,作用域在函数内部,从它被初始化为temp。 对于类成员const引用,作用域是构造函数,它正在初始化为temp。

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

相关问题