什么时候临时用作命名对象的初始化器?

时间:2012-02-11 17:20:20

标签: c++ temporary-objects

In" C ++编程语言(第3版)"第255页:

  

临时可用作const引用或命名对象的初始值设定项。例如:

void g(const string&, const string&);

void h(string& s1, string& s2)
{
   const string& s = s1+s2;
   string ss = s1+s2;

   g(s, ss);  // we can use s and ss here
}
     

这很好。当"它的"引用或命名对象超出范围。

他是说当s1+s2超出范围时,ss创建的临时对象会被销毁吗? 一旦将副本初始化为ss,它是否会被销毁?

2 个答案:

答案 0 :(得分:2)

代码中唯一的临时值是s1 + s2。第一个绑定到const-ref s,因此它的生命周期延长到s的生命周期。您的代码中没有其他内容是临时的。特别是,sss都不是临时的,因为它们显然是命名变量

第二个s1 + s2当然也是一个临时的,但它在行的末尾消失,仅用于初始化ss

更新:也许有一点值得强调:在最后一行g(s, ss);,重点是s是一个完全有效的参考,它是正如您可能预料到的那样,不是一个悬垂的引用,正是因为对const引用的临时性的生命周期扩展规则。

答案 1 :(得分:1)

两者都是真的,因为创造了两个临时工具:

//creates a temporary that has its lifetime extended by the const &
const string& s = s1+s2;

//creates a temporary that is copied into ss and destroyed
string ss= s1+s2;