初期化子リストで初期化できるのは集約のみです。8.5.1:1 に従って、ユーザー提供のコンストラクターを含めると、構造体またはクラスが集約になるのを防ぎます。
c++11
8.5.1 集計 [dcl.init.aggr]
1 - 集約は、ユーザー提供のコンストラクターを持たない配列またはクラス (条項 9) です [...]
C++03 では、
c++03
8.5.1 - 集計 [dcl.init.aggr]
1 - 集約は、ユーザー宣言されたコンストラクターを持たない配列またはクラス (節クラス) です [...]
集計は POD とは異なります ( c++11 9:10)。すべての集合体が POD であるとは限らず、すべての POD が集合体であるとは限りません。ユーザー提供のデストラクタを持つクラスは集約であっても POD ではない可能性がありますが、非コピーの非デフォルト コンストラクタを持つクラスは POD であっても集約ではない可能性があります。
デモンストレーション:
#include <type_traits>
#include <iostream>
struct non_pod_aggregate { int i, j; ~non_pod_aggregate() {} };
struct non_aggregate_pod { int i, j; non_aggregate_pod(int) {}
non_aggregate_pod() = default; };
int main() {
std::cout << std::is_pod<non_pod_aggregate>::value << '\n'; // false
std::cout << std::is_pod<non_aggregate_pod>::value << '\n'; // true
non_pod_aggregate{0, 0};
// non_aggregate_pod{0, 0}; // does not compile
}
C++03 では、すべての POD ( c++03 9:4) は集合体ですが、POD ではない集合体を持つことも可能です。上記のように、ユーザー提供のデストラクタは、構造体が POD であることを不適格にするのに十分です。