Skip to content

Latest commit

 

History

History
48 lines (33 loc) · 1.49 KB

012-cpp14-core-member-initializer-list-init.md

File metadata and controls

48 lines (33 loc) · 1.49 KB

メンバー初期化子とアグリゲート初期化の組み合わせ

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。