在下面的代码片段中......存储对Quote::toXML
成员变量中ToXML::s_
返回的临时字符串的引用是安全的,至少只要它与{{{ 1}}运营商?即是子表达式<<
生效的结果,直到下一个q.toXML
?
这里有什么完整的表达w.r.t. ;
的返回值。整个q.toXML
或对std::cout
构造函数的调用?
ToXML
答案 0 :(得分:2)
是的,这是安全的。
来自[class.temp]:
有两种情况下,临时表在与完整表达结束时不同的点被销毁。 [...]
第二个上下文是引用绑定到temporary.117引用的临时值 绑定或临时,即绑定引用的子对象的完整对象仍然存在 在参考文件的生命周期中除外:
- 绑定到函数调用(5.2.2)中的引用参数的临时对象将持续到完成 包含调用的完整表达式。
我们正处于那个要点。临时对象绑定到引用参数(s
)并持续到包含该调用的完整表达式完成为止。也就是说,它一直持续到
std::cout << ToXML("quote", q.toXML()) << std::endl;
// --- here ---------------------------------------^
由于它在整个使用过程中持续使用,因此非常安全。但是,只要您执行以下操作:
ToXML x("quote", q.toXML());
你被困在一个悬挂的参考,所以我会谨慎使用这种模式。