对于这个程序
我收到的输出是:
#include <iostream>
using std::cout;
struct C
{
C() { cout << "Default C called!\n"; }
C(const C &rhs) { cout << "CC called!\n"; }
};
const C f()
{
cout << "Entered f()!\n";
return C();
}
int main()
{
C a = f();
C b = a;
return 0;
}
我收到的输出是:
Entered f()!
Default C called!
CC called!
由于f()
返回的是值,因此它应该返回一个临时对象。由于T a = x;
等同于T a(x);
,那么在构造a
时,会调用复制构造函数,并将临时对象作为参数传入。
-fno-elide-constructors
选项,它可以准确地显示发生了什么!有时这些优化会让学习者感到困惑 :) 然而,我同意默认情况下应该开启它们,因为对于一个不知情的人来说,默认情况下构建将被优化。 - legends2k