エラーになるのは何故?(デフォルトコンストラクタの合成)

コード(1)

// main.cpp

struct A
{
    A (int a)
    {
    }
};

int main()
{
    A a;
}

コンパイルエラー

$ g++ main.cpp 
main.cpp: In function 'int main()':
main.cpp:12: error: no matching function for call to 'A::A()'
main.cpp:5: note: candidates are: A::A(int)
main.cpp:4: note:                 A::A(const A&)

コード(2)

// main.cpp

struct A
{
    A (int a)
    {
    }
};

struct B
{
    A a;
};

int main()
{
    B b;
}

コンパイルエラー

$ g++ main.cpp
main.cpp: In constructor 'B::B()':
main.cpp:11: error: no matching function for call to 'A::A()'
main.cpp:5: note: candidates are: A::A(int)
main.cpp:4: note:                 A::A(const A&)
main.cpp: In function 'int main()':
main.cpp:17: note: synthesized method 'B::B()' first required here

コード(3)

// main.cpp

struct A
{
    A (int a)
    {
    }
};

struct B
    : A
{
};

int main()
{
    B b;
}

コンパイルエラー

$ g++ main.cpp
main.cpp: In constructor 'B::B()':
main.cpp:12: error: no matching function for call to 'A::A()'
main.cpp:5: note: candidates are: A::A(int)
main.cpp:4: note:                 A::A(const A&)
main.cpp: In function 'int main()':
main.cpp:17: note: synthesized method 'B::B()' first required here

答え

デフォルトコンストラクタがないから

解説

クラスにコンストラクタがない場合は、デフォルトコンストラクタがコンパイラによって合成される。しかし、以下のような場合にデフォルトコンストラクタは合成されない。

  • 明示的に定義されたデフォルトコンストラクタ以外のコンストラクタが 1 つ以上あるクラス ... コード(1)
  • デフォルトコンストラクタを持たないクラス型のメンバ変数を持つクラス ... コード(2)
  • デフォルトコンストラクタを持たないクラス型を継承するクラス ... コード(3)

デフォルトコンストラクタを持たないメリットはあまりない。そのため、空という意味を持つ特殊なオブジェクトを生成するためのデフォルトコンストラクタを別途宣言したりすることが多い。
デフォルトコンストラクタがないとできないことは、関連エントリを参照。