为什么临时生命周期扩展会导致多次调用析构函数?

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调用的数量会按比例增长.)

rub*_*nvb 5

您的函数TakeTemp按值获取其参数,并按值返回参数.

你在那里制作副本,因此现在有两个Temp要删除的对象.

您看到的两个被破坏的对象是这里调用的两个函数的返回值:

TakeTemp(GetTemp());
         ^ returns a Temp
^ returns a Temp
Run Code Online (Sandbox Code Playgroud)

  • @rubenvb它将显示至少一次,因为无法省略复制功能参数`temp`. (2认同)