我看了一下这个演示文稿,在幻灯片379中,它显示了以下代码(稍作修改):
#include <iostream>
using namespace std;
struct A
{
A() { cout << "A()" << endl; }
A(int v) { cout << "A(int)" << endl; }
~A() { cout << "~A()" << endl; }
};
struct X
{
X(int v) { a = v; }
X(long v) : a(v) {}
A a;
};
int main()
{
cout << "bad style:" << endl;
{ X slow(int(2)); }
cout << "good style:" << endl;
{ X fast(long(2)); }
}
Run Code Online (Sandbox Code Playgroud)
输出是:
bad style:
A()
A(int)
~A()
~A()
good style:
A(int)
~A()
Run Code Online (Sandbox Code Playgroud)
(这段代码在我的机器上运行,用g ++编译)
现在,我理解为什么构造函数将以坏样式调用两次,但为什么析构函数会这样做呢?
X(int v) { a = v; }
// ^^^^^
Run Code Online (Sandbox Code Playgroud)
带下划线的是一项任务.有没有operator=接受一个int(v),但有一个隐含的转换,从int到A.因此,A构造一个类型的临时对象并将其传递给编译器为您生成的赋值运算符.它会在以后被破坏(在完整表达之后它是在末尾创建的)并且你的第二个析构函数是你没想到的.