另一个c ++临时终身混乱

时间:2015-09-27 22:55:23

标签: c++

在下面的代码片段中......存储对Quote::toXML成员变量中ToXML::s_返回的临时字符串的引用是安全的,至少只要它与{{{ 1}}运营商?即是子表达式<<生效的结果,直到下一个q.toXML

这里有什么完整的表达w.r.t. ;的返回值。整个q.toXML或对std::cout构造函数的调用?

ToXML

1 个答案:

答案 0 :(得分:2)

是的,这是安全的。

来自[class.temp]:

  

有两种情况下,临时表在与完整表达结束时不同的点被销毁。 [...]

     

第二个上下文是引用绑定到temporary.117引用的临时值   绑定或临时,即绑定引用的子对象的完整对象仍然存在   在参考文件的生命周期中除外:
   - 绑定到函数调用(5.2.2)中的引用参数的临时对象将持续到完成   包含调用的完整表达式。

我们正处于那个要点。临时对象绑定到引用参数(s)并持续到包含该调用的完整表达式完成为止。也就是说,它一直持续到

std::cout << ToXML("quote", q.toXML()) << std::endl;
// --- here ---------------------------------------^

由于它在整个使用过程中持续使用,因此非常安全。但是,只要您执行以下操作:

ToXML x("quote", q.toXML());

你被困在一个悬挂的参考,所以我会谨慎使用这种模式。