C++14ではメンバー初期化子とアグリゲート初期化が組み合わせられるようになった。
メンバー初期化子とはクラスの非static
データメンバーを=
で初期化できるC++11の機能だ。
struct S
{
// メンバー初期化子
int data = 123 ;
} ;
アグリゲート初期化とはアグリゲートの条件を満たす型をリスト初期化で初期化できるC++11の機能だ。
struct S
{
int x, y, z ;
} ;
S s = { 1,2,3 } ;
// s.x == 1, s.y == 2, s.z == 3
C++11ではメンバー初期化子を持つクラスはアグリゲート型の条件を満たさないのでアグリゲート初期化ができない。
C++14では、この制限が緩和された。
struct S
{
int x, y=1, z ;
} ;
S s1 = { 1 } ;
// s1.x == 1, s1.y == 1, s1.z == 0
S s2{ 1,2,3 } ;
// s2.x == 1, s2.y == 2, s2.z == 3
アグリゲート初期化で、メンバー初期化子を持つ非static
データメンバーに対応する値がある場合はアグリゲート初期化が優先される。省略された場合はメンバー初期化子で初期化される。アグリゲート初期化でもメンバー初期化子でも明示的に初期化されていない非static
データメンバーは空の初期化リストで初期化された場合と同じになる。
機能テストマクロは__cpp_aggregate_nsdmi
, 値は201304。