初期化の種類はちょっと面倒かもしれませんが、この場合は些細なことです。為に:
public:
X()
: m_array()
{}
括弧の間の式リストが空であるため、値の初期化が発生します。同様に:
public:
X()
: m_array{}
{}
ブレース初期化リストが空であるため、リストの初期化が行われ、続いて値の初期化が行われます。
より包括的な回答を得るために、N4140 の 8.5 を見てみましょう。
- オブジェクトに初期化子が指定されていない場合、オブジェクトはデフォルトで初期化されます。自動または動的ストレージ期間を持つオブジェクトのストレージが取得されると、そのオブジェクトの値は不定になり、オブジェクトの初期化が実行されない場合、そのオブジェクトはその値が置き換えられるまで不定値を保持します (5.17)。
この不確定な値は、ガベージ値と呼ばれるものです。
型のオブジェクトまたは参照をゼロで初期化T
するとは、次のことを意味します。
— T が配列型の場合、各要素はゼロで初期化されます
タイプのオブジェクトを値で初期化T
するとは、次のことを意味します。
— T が (おそらく cv 修飾された) クラス型の場合、オブジェクトはデフォルトで初期化されます。...
— T が配列型の場合、各要素は値で初期化されます。
— それ以外の場合、オブジェクトはゼロで初期化されます。
初期化子のセマンティクスは次のとおりです。... — 初期化子が (括弧で囲まれていない) 波括弧初期化リストである場合、オブジェクトまたは参照はリスト初期化されます (8.5.4)。
— 初期化子が () の場合、オブジェクトは値で初期化されます。
これまでのところ、int
はクラス型ではないため、値の初期化によって配列の各要素がゼロになることは明らかです。しかし、配列は集合体であるため、リストの初期化と集合体の初期化についてはまだ説明していません。
§8.5.4:
型のオブジェクトまたは参照のリスト初期化は、T
次のように定義されます。
— T が集合体の場合、集合体の初期化が実行されます (8.5.1)。
§8.5.1 に戻ります。
- 集約内のメンバーよりもリスト内の初期化句が少ない場合、明示的に初期化されていない各メンバーは、そのブレースまたは等号初期化子から初期化されるか、またはブレースまたは等号初期化子
がない場合、空のイニシャライザ リスト (8.5.4) から。
そして、再び §8.5.4 で終わります:
型のオブジェクトまたは参照のリスト初期化は、T
次のように定義されます。
— それ以外の場合、イニシャライザ リストに要素がない場合、オブジェクトは値で初期化されます。
(ドラフト) 標準をたどると息が詰まる可能性があるため、cppreferenceをお勧めします。
関連リンク:
cppリファレンス:
ドラフト標準: