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

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

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

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

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

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

A a = A();

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

Sapo=カエル

sapo1

“管理人 DigiSapo ”…ってなんや? もう地上デジ化とかとうに終っとるで、というツッコミがひょっとしたらあるかもしれないので、最初に書いときます。

ポルトガル語でカエルの事を Sapo (サッポ)といいます。ポルトガル語と兄弟と言われるスペイン語もたぶん同じです(調べてはいない)。

Sapo は男性名詞ですが必ずしもオスの意味ではありません。ロマンス系語であるポルトガル語には名詞に必ず性別がありますが、これは本質的には生物学的性別とは無関係で名詞を分類するための仕組みに過ぎません。