One*_*ero 3 c++ temporary lifetime xvalue c++11
请考虑以下代码段:
#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;
}
Run Code Online (Sandbox Code Playgroud)
当我跑TakeTemp(GetTemp());,输出看起来像
GetTemp
Temp()
TakeTemp
~Temp()
~Temp()
Run Code Online (Sandbox Code Playgroud)
注意,~Temp()这里调用两次(但只构造了1个temp obj).这似乎很奇怪,因为1)返回的临时变量GetTemp()应该将其生命周期扩展到完整表达式,并且2)因为我们temp直接TakeTemp返回,返回值optmization将重用相同的对象.
任何人都可以解释为什么这里有多个dstor调用?
(注意,如果我们放置更多层的TakeTemp(),dstor调用的数量会按比例增长.)
您的函数TakeTemp按值获取其参数,并按值返回参数.
你在那里制作副本,因此现在有两个Temp要删除的对象.
您看到的两个被破坏的对象是这里调用的两个函数的返回值:
TakeTemp(GetTemp());
^ returns a Temp
^ returns a Temp
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |