use*_*146 2 c++ pass-by-reference lifetime temporary-objects reference-binding
我需要一些关于 const 引用的澄清。从这个链接:
const Foo &myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)
const 引用延长了本地对象的寿命。但是当我检查这个链接时,尽管他们使用了 const 引用
Sandbox(const string& n) : member(n) {}
Run Code Online (Sandbox Code Playgroud)
字符串“四”的寿命没有增加。
Sandbox sandbox(string("four"));
Run Code Online (Sandbox Code Playgroud)
他们用了这句话
只有本地常量引用才能延长寿命。
那么在第二个链接中,字符串“four”不是主函数的本地字符串吗?const 引用不应该n延长其寿命吗?
那么为什么第二个环节的寿命没有延长呢?
您引用的两个链接在某种意义上是不同的,一个显示本地常量引用的使用,另一个显示类成员常量引用的使用。
\n\n当我们创建本地常量引用并引用临时对象时,编译器会延长临时对象的生命周期,直到本地常量引用的范围。
\n\n指向临时对象的类成员 const 引用将导致意外结果,因为临时对象的生命周期不会延长到调用初始化类成员引用的构造函数之外。正如答案之一所解释的,临时对象只能存活到构造函数完成为止。
\n\n引用以下答案:\n const 引用是否会延长临时引用的寿命?
\n\n\n\n\n生命周期延长不能通过函数参数传递。\xc2\xa712.2/5 [类.临时]:
\n\n第二个上下文是当引用绑定到临时对象时。引用所绑定的临时对象或临时对象(临时对象所绑定的子对象的完整对象)在引用的生命周期内持续存在,除非下面指定。临时绑定到构造函数\xe2\x80\x99s 构造函数初始化程序 (\xc2\xa712.6.2 [class.base.init]) 中的引用成员将持续存在,直到构造函数退出。函数调用 (\xc2\xa75.2.2 [expr.call]) 中引用参数的临时绑定将持续存在,直到包含调用的完整表达式完成为止。
\n
如果您分析正确,您将意识到在这两种情况下,临时的生命周期都会延长,直到初始化引用的范围有效为止。一旦引用的范围超出范围,临时对象就会变得无效。
\n\n对于本地常量引用,作用域位于函数内部,从该函数内部将其初始化为临时值。\n对于类成员常量引用,作用域是在其初始化为临时值的构造函数。
\n\n您还应该阅读这篇 GOTW 文章:\n https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/
\n