スカラーの配列に欠落している初期化子がデフォルトでゼロに設定されていることはよく知られています。
int A[5]; // Entries remain uninitialized
int B[5]= { 0 }; // All entries set to zero
しかし、これは(以下)保証されていますか?
int C[5]= { }; // All entries set to zero
空のブレース初期化は、配列の集約初期化を実行します。これにより、int
要素のゼロ初期化が行われます。
はい、これは保証されています。
はい、 集約の初期化 のルールに従って、保証されています(配列C
のすべての要素は value-initialized 、つまり zero-初期化済み to 0
この場合)。
(エンファシス鉱山)
初期化節の数がメンバーの数より少ない場合
and bases (since C++17)
または初期化リストが完全に空の場合、残りのメンバーand bases (since C++17)
は、通常のリスト初期化ルールに従って、空のリストによってby their default initializers, if provided in the class definition, and otherwise (since C++14)
が初期化されます(デフォルトのコンストラクターで非クラス型および非集約クラスの値初期化を実行し、集約の集約初期化を行います)。
PS:
int A[5]; // Entries remain uninitialized
「初期化されないまま」は正確ではない場合があります。 int A[5];
の場合、A
のすべての要素は default-initialized になります。 A
が静的オブジェクトまたはスレッドローカルオブジェクトの場合、要素は zero-initialized to 0
になります。そうでない場合は何も実行されず、不定の値になります。
実際、あなたが言うときint A[5] = { 0 };
あなたは言っている:最初の要素をゼロに初期化する。他のすべての位置は、集計の初期化のためにゼロに初期化されます。
この行は、配列をゼロで満たす実際の責任です:int A[5] = { };
int A[5] = { 1 };
を使用すると、最初の位置が1に初期化されるだけです。