c++ - 为什么临时延长生命周期会导致多次调用析构函数?

标签 c++ c++11 lifetime temporary xvalue

考虑以下片段:

#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 个临时对象)。这看起来很奇怪,因为 1) GetTemp() 返回的临时变量应该将它的生命周期延长到完整的表达式,并且 2) 因为我们返回 temp直接在TakeTemp , 返回值优化将重用同一个对象。

谁能解释为什么这里有多个 dstor 调用?

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

最佳答案

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

您正在那里制作拷贝,因此现在有两个 Temp 对象要删除。

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

TakeTemp(GetTemp());
         ^ returns a Temp
^ returns a Temp

关于c++ - 为什么临时延长生命周期会导致多次调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54456282/

相关文章:

c++ - 处理指向模板中成员的指针,同时创建更简单的 `bind` 以与 asio 一起使用

rust - “temporary value dropped while borrowed”与捕获闭包

rust - 特征中的生命周期

c++ - 如何使用 GDB 输出 C + 汇编程序跟踪?

c++ - C++ 的分布式共享内存库?

c++ - 我可以根据类声明不同的 typedef 吗?

c++ - 哪些类应该既不可复制又不可移动?

c++ - constexpr 未定义行为

rust - 如何实现支持可变迭代器的容器?

c++ - c++思维中遇到的友元迭代器和友元类迭代器有什么区别?