【发布时间】:2019-01-31 08:30:57
【问题描述】:
考虑以下 sn-p:
#include <iostream>
using namespace std;
class Temp {
public:
Temp() { cout << "Temp()" << endl;}
~Temp() { cout << "~Temp()" << endl;}
};
Temp GetTemp() {
cout << "GetTemp" << endl;
return Temp();
}
Temp TakeTemp(Temp temp) {
cout << "TakeTemp" << endl;
return temp;
}
int main()
{
TakeTemp(GetTemp());
return 0;
}
当我运行TakeTemp(GetTemp()); 时,输出看起来像
GetTemp
Temp()
TakeTemp
~Temp()
~Temp()
请注意,~Temp() 在这里被调用了两次(但只构造了 1 个临时 obj)。这看起来很奇怪,因为 1) GetTemp() 返回的临时变量的生命周期应该扩展到完整的表达式,以及 2) 因为我们直接在 TakeTemp 中返回 temp,所以返回值优化将重用相同的对象。
谁能解释为什么这里有多个 dstor 调用?
(请注意,如果我们在周围放置更多的 TakeTemp() 层,则 dstor 调用的数量会成比例地增长。)
【问题讨论】:
-
在那里添加了完整的程序。
-
这里也没有延长生命周期(到目前为止发布的代码部分)。临时的生命周期是直到完整表达式的结尾。
-
不是完整的表达式
TakeTemp(GetTemp());吗?在这种情况下,相同的临时变量将一直存在。 -
是的,这就是完整的表达方式。问题是你用“延长”这个词来描述它的自然寿命是什么
-
正在调用隐式复制构造函数。添加
Temp(Temp const&) { cout << "Temp(Temp const&)" << endl;}
标签: c++ c++11 lifetime temporary xvalue