1

私は次のサンプルコードを持っています (私のプログラムの簡略化されたバージョン)

クラス 'some_class' には、既定のパラメーターを持つコンストラクターがあります。コンパイラは、このコンストラクターをコピー コンストラクターとして認識できます。メイン関数では、'b' というコピー構築オブジェクトを注文すると、このコンストラクターが呼び出されます。しかし、関数の結果から 'c' を構築すると、コンパイラはコンパイラによって生成されたコピー コンストラクタ (ビット パターンをコピーする) を呼び出します。c.some_data の値でわかります。これは、自分のコピー コンストラクターによって値 2 に設定されているはずです。

1) 規格はこれについて何と言っていますか? 2) 私のコンパイラは壊れていますか?

オプションなしで MinGW を使用しますが、ソース ファイル名と実行可能ファイルの名前を指定します。MinGW の公式 Web サイトから gnu オープン ソース コンパイラのポートを取得しました。最新バージョンを使用しています。バグを見つけましたか、それとも私の (誤解) C++ の理解によるものですか?

前もって感謝します

#include <iostream>
#include <string>

class some_class
{
public:
    some_class(int p = 0) :
        some_data(p)
    {
        std::cout << "user defined constructor (p = " << p << ")" << std::endl;
    }
    some_class(const some_class &, int = 0)
    {
        std::cout << "user defined copy constructor" << std::endl;

        some_data = 2;
    }

    int some_data;
};

extern some_class some_function_returning_some_class_object();

int main(int, char **)
{
        std::cout << "creating a, with no parameters" << std::endl;
    some_class a;
        std::cout << "creating b, a copy of a" << std::endl;
    some_class b = a;
        std::cout << "creating c, copy constructed from a function result" << std::endl;
    some_class c = some_function_returning_some_class_object();
        std::cout << "c.some_data = " << c.some_data << std::endl;
}

some_class some_function_returning_some_class_object()
{
    some_class a(1);

    return a;
}

出力は次のとおりです。

creating a, with no parameters
user defined constructor (p = 0)
creating b, a copy of a
user defined copy constructor
creating c, copy constructed from a function result
user defined constructor (p = 1)
c.some_data = 1
4

1 に答える 1

4

コンパイラーは、コンパイラー定義のデフォルトのコピーコンストラクターを使用していません。おそらく、コピーを完全にスキップするために戻り値の最適化を使用しています。

于 2012-10-19T08:43:07.063 に答える