次のコードを検討してください。
#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 はどのように作成されるのでしょうか (この場合もコンストラクター呼び出しがないため)。
A b = a.fun(c);
行を置き換えてa.fun(c)
、最初の方法または 2 番目の方法を使用してコンパイルすると、コピー コンストラクターも 2 回呼び出されます。では、前の段落で説明したケースで一時オブジェクトのコピー コンストラクターが省略されている場合、この場合はなぜ省略されないのでしょうか。