考虑以下代码:
#include <iostream>
using namespace std;
class A
{
public:
int a;
A(): a(5)
{
cout << "Constructor\n";
}
A(const A &b)
{
a = b.a;
cout << "Copy Constructor\n";
}
A fun(A a)
{
return a;
}
};
int main()
{
A a, c;
A b = a.fun(c);
return 0;
}
上面代码的输出g++ file.cpp
是:
Constructor
Constructor
Copy Constructor
Copy Constructor
上面代码的输出g++ -fno-elide-constructors file.cpp
是:
Constructor
Constructor
Copy Constructor
Copy Constructor
Copy Constructor
我知道返回值优化。我的问题是省略了对复制构造函数的哪个调用(返回期间的临时对象或返回的对象被复制到 b)?
如果省略的复制构造函数是用于创建 b 的构造函数,那么 b 是如何创建的(因为在这种情况下也没有构造函数调用)?
如果我用第一种方法甚至第二种方法替换该行并进行编译,那么复制构造函数也被调用了 2 次A b = a.fun(c);
。a.fun(c)
那么,如果在上一段解释的情况下,临时对象的复制构造函数被省略了,那么为什么在这种情况下不省略呢?