使用g++ -O0 a.cpp -std=c++98
编译的程序C ++:
class A
{
public:
A(const A& a) { cout << "A copy" << endl; }
A() { cout << "A" << endl; }
~A() {cout << "~A" << endl; }
};
A f()
{
cout << "f1" << endl;
A a1;
cout << "f2" << endl;
return a1;
}
int main()
{
cout << "m1" << endl;
A a2 = f();
cout << "m2" << endl;
}
产生输出:
m1
f1
A
f2
m2
~A
困扰我的是,在f2之后,不会调用析构函数和复制构造函数。根据我的理解,a1超出了范围,必须调用它的析构函数。看起来该对象从本地a1移动到a2而不进行复制。我知道有返回值优化,但它是优化和优化不能改变代码的逻辑,并且缺少输出说~A和A副本。