4

在“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吗?

4

2 回答 2

2

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

第二个s1 + s2当然也是临时的,但它在行尾死掉,ss只用于初始化。

更新:也许有一点值得强调:在最后一行中g(s, ss);,这一点s是一个完全有效的参考,它不是你可能预期的悬空参考,正是因为临时绑定的生命周期延长规则到常量引用。

于 2012-02-11T17:23:33.197 回答
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;
于 2012-02-11T17:24:07.420 回答