当前位置 : 主页 > 编程语言 > c++ >

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

来源:互联网 收集:自由互联 发布时间:2021-06-23
请考虑以下代码段: #include iostreamusing 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 "TakeT
请考虑以下代码段:

#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个temp obj).这似乎很奇怪,因为1)GetTemp()返回的临时变量应该将其生命周期扩展到完整表达式,并且2)因为我们直接在TakeTemp中返回temp,返回值optmization将重用相同的对象.

任何人都可以解释为什么这里有多个dstor调用?

(注意,如果我们放置更多层的TakeTemp(),dstor调用的数量会按比例增长.)

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

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

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

TakeTemp(GetTemp());
         ^ returns a Temp
^ returns a Temp
网友评论