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
,它是否会被销毁?
答案 0 :(得分:2)
代码中唯一的临时值是s1 + s2
。第一个绑定到const-ref s
,因此它的生命周期延长到s
的生命周期。您的代码中没有其他内容是临时的。特别是,s
和ss
都不是临时的,因为它们显然是命名变量。
第二个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;