タグ: C++

C++11| コピー初期化(A a = A()みたいなやつ)の罠

例えば次のようなシンプルなクラスを考えます。

    class A {
      public:
          A() {}  // デフォルトコンストラクタ
    };
    // インスタンス化
    A a = A();

この時、どのメソッドがどのように呼びだされるのか実際の動作をトレースしてみます。

コード上に記述されていませんが C++ では暗黙に自動生成されるメンバ関数があることに留意する必要があります。上のコードではコピーコンストラクタと代入演算子、それに C++11 以降であればムーブコンストラクタとムーブ代入演算子が暗黙に宣言されます。

さて、インスタンス化の行:

A a = A();

は”=”の記号で代入するかのような表記ですけども、文法上はコピーコンストラクタによる初期化文の形式のひとつになります。