使用 const 引用延长临时对象的寿命
Prolonging life of a temporary object using const reference
我需要一些关于 const 引用的说明。
来自 this link:
const Foo &myFoo = FuncBar();
常量引用延长了本地对象的寿命。但是当我检查 this link 虽然他们使用了常量引用
Sandbox(const string& n) : member(n) {}
字符串 "four" 的生命周期没有增加。
Sandbox sandbox(string("four"));
他们用了句子
Only local const references prolong the lifespan.
那么在第二个 link 中,字符串 "four" 不是主函数的局部变量,const 引用 n
不应该延长它的生命吗?
那么为什么在第二个 link 中生命周期没有得到延长?
您提到的两个链接在某种意义上是不同的,一个显示使用本地常量引用,另一个显示使用 class 成员常量引用。
当我们创建本地 const 引用并引用临时对象时,然后在此编译器中将临时对象的生命周期延长到本地 const 引用的范围。
Class 成员 const 引用指向临时对象将导致意外结果,因为临时对象的生命不会延长到调用初始化 class 成员引用的构造函数之外。正如其中一个答案中所解释的那样,临时文件只会在构造函数完成之前存在。
引用以下答案:
Does a const reference prolong the life of a temporary?
The lifetime extension is not transitive through a function argument. §12.2/5 [class.temporary]:
The second context is when a reference is bound to a temporary. The temporary to which the reference is bound or the temporary that is the complete object to a subobject of which the temporary is bound persists for the lifetime of the reference except as specified below. A temporary bound to a reference member in a constructor’s ctor-initializer (§12.6.2 [class.base.init]) persists until the constructor exits. A temporary bound to a reference parameter in a function call (§5.2.2 [expr.call]) persists until the completion of the full expression containing the call.
如果你分析得当,你会发现在这两种情况下,临时对象的生命周期都会延长,直到引用初始化的范围有效。一旦引用的范围超出范围,临时对象就会变得无效。
对于本地 const 引用,作用域在一个函数内部,从那里它被初始化为一个临时值。
对于 class 成员 const 引用,作用域是构造函数,它被初始化为临时值。
您还应该阅读这篇 GOTW 文章:
https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/
我需要一些关于 const 引用的说明。
来自 this link:
const Foo &myFoo = FuncBar();
常量引用延长了本地对象的寿命。但是当我检查 this link 虽然他们使用了常量引用
Sandbox(const string& n) : member(n) {}
字符串 "four" 的生命周期没有增加。
Sandbox sandbox(string("four"));
他们用了句子
Only local const references prolong the lifespan.
那么在第二个 link 中,字符串 "four" 不是主函数的局部变量,const 引用 n
不应该延长它的生命吗?
那么为什么在第二个 link 中生命周期没有得到延长?
您提到的两个链接在某种意义上是不同的,一个显示使用本地常量引用,另一个显示使用 class 成员常量引用。
当我们创建本地 const 引用并引用临时对象时,然后在此编译器中将临时对象的生命周期延长到本地 const 引用的范围。
Class 成员 const 引用指向临时对象将导致意外结果,因为临时对象的生命不会延长到调用初始化 class 成员引用的构造函数之外。正如其中一个答案中所解释的那样,临时文件只会在构造函数完成之前存在。
引用以下答案: Does a const reference prolong the life of a temporary?
The lifetime extension is not transitive through a function argument. §12.2/5 [class.temporary]:
The second context is when a reference is bound to a temporary. The temporary to which the reference is bound or the temporary that is the complete object to a subobject of which the temporary is bound persists for the lifetime of the reference except as specified below. A temporary bound to a reference member in a constructor’s ctor-initializer (§12.6.2 [class.base.init]) persists until the constructor exits. A temporary bound to a reference parameter in a function call (§5.2.2 [expr.call]) persists until the completion of the full expression containing the call.
如果你分析得当,你会发现在这两种情况下,临时对象的生命周期都会延长,直到引用初始化的范围有效。一旦引用的范围超出范围,临时对象就会变得无效。
对于本地 const 引用,作用域在一个函数内部,从那里它被初始化为一个临时值。 对于 class 成员 const 引用,作用域是构造函数,它被初始化为临时值。
您还应该阅读这篇 GOTW 文章: https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/