附加析构函数调用的原因?

Reason of additional destructor call?

给出的是以下简单的 class:

#include <iostream>

class Foo{
    int a, b;
    public:
        Foo(int _a = 0, int _b = 0) : a(_a), b(_b) { 
            std::cout << "Foo(int, int)" << "\n"; 
        }

        Foo(const Foo& foo) : a(foo.a), b(foo.b) { 
            std::cout << "Foo(const Foo&)" << "\n"; 
        }

        Foo& operator=(const Foo& other) { 
            std::cout << "operator=(const Foo&)" << "\n"; 
            if(this != &other){
                a = other.a; 
                b = other.b;
            }
            return *this; 
        }

        ~Foo() { 
            std::cout << "~Foo()" << "\n"; 
        }

        Foo operator+(const Foo& other){
            std::cout << "foo.operator+(const Foo&)" << "\n";
            return Foo(a + other.a, b + other.b);
        }
};

和主要的:

int main(){
    Foo f1, f2(1, 2), f3;
    std::cout << "-----------" << "\n";
    f3 = f1 + f2;                          // (*)
    std::cout << "-----------" << "\n";
    return 0;
}

我使用 -std=c++11 进行编译,为了演示目的还使用了 -fno-elide-constructors 标志。输出内容为:

Foo(int, int)
Foo(int, int)
Foo(int, int)
-----------
foo.operator+(const Foo&) // (1)
Foo(int, int)             // (2)
Foo(const Foo&)           // (3)
~Foo()                    // (4)
operator=(const Foo&)     // (5)
~Foo()                    // (6)
-----------
~Foo()
~Foo()
~Foo()

据我正确理解,f3 = f1 + f2; (*) 行发生以下情况:

  1. 显然,f1.operator+(f2)被调用了。
  2. 创建了一个新的(临时)对象。让我们用 T.
  3. 来表示它
  4. 由于operator+() 函数没有return 引用,我们调用复制构造函数来构造T 的副本T2。我们returnT2.
  5. 调用析构函数以删除临时对象T
  6. 我们调用复制赋值运算符将T2的所有成员赋值给f3

我的问题:我真的不明白 (6) 的目的是什么。为什么要额外调用析构函数,即我在这里缺少什么?

what am I missing here?

毁灭T2.

调用了3+2个构造函数,一定也调用了3+2个析构函数!