9

次のコードを検討してください。

#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 回呼び出されます。では、前の段落で説明したケースで一時オブジェクトのコピー コンストラクターが省略されている場合、この場合はなぜ省略されないのでしょうか。

4

2 に答える 2