以下の動作は明確に定義されていますか?
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int a[10] = {1, 2, 3, 4, 5};
for(const auto &i: a)
cout << i << endl;
return 0;
}
出力:
1
2
3
4
5
0
0
0
0
0
はい、余分な要素は「ゼロ」に初期化されます (整数は 0 に、浮動小数点数は 0.0 に、ポインタは にNULL
)。
static
より正確には、C 標準では、保存期間があるかのように初期化する必要があります。
C99 標準、パラグラフ 6.7.8.21:
集合体の要素またはメンバーよりもブレースで囲まれたリスト内の初期化子が少ない場合、または配列内の要素よりも既知のサイズの配列を初期化するために使用される文字列リテラル内の文字が少ない場合、集合体の残りの部分は静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。
6.7.8.10:
自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。静的ストレージ期間を持つオブジェクトが明示的に初期化されていない場合:
— ポインター型の場合、null ポインターに初期化されます。
— 算術型の場合、(正または符号なし) ゼロに初期化されます。
— 集合体の場合、すべてのメンバーはこれらの規則に従って (再帰的に) 初期化されます。
— 共用体の場合、最初に名前が付けられたメンバーは、これらの規則に従って (再帰的に) 初期化されます。
くそー、それはC ++です。(@yuan 以外は誰もこれに気づきませんでした、ありがとう!)
したがって、C++11 の段落 8.5.1.7:
タイプ T のオブジェクトを値で初期化するとは、次のことを意味します。
— T がユーザー提供のコンストラクター (12.1) を持つ (おそらく cv 修飾された) クラス型 (第 9 節) である場合、T のデフォルト コンストラクターが呼び出されます (T にアクセス可能なデフォルト コンストラクターがない場合、初期化は整形式ではありません)。 );
— T が (おそらく cv 修飾された) ユーザー提供のコンストラクターを持たない非共用体クラス型である場合、オブジェクトはゼロで初期化され、T の暗黙的に宣言されたデフォルト コンストラクターが自明でない場合、そのコンストラクターが呼び出されます。
— T が配列型の場合、各要素は値で初期化されます。
— それ以外の場合、オブジェクトはゼロで初期化されます。
8.5.1.5:
T 型のオブジェクトまたは参照をゼロで初期化するとは、次のことを意味します。
— T がスカラー型 (3.9) の場合、オブジェクトは値 0 (ゼロ) に設定され、整数定数式として取得され、T に変換されます。103
— T が (おそらく cv 修飾された) 非共用体クラス型である場合、各非静的データ メンバーと各基本クラス サブオブジェクトはゼロで初期化され、パディングはゼロ ビットに初期化されます。
— T が (おそらく cv 修飾された) 共用体型の場合、オブジェクトの最初の非静的名前付きデータ メンバーはゼロ初期化され、パディングはゼロ ビットに初期化されます。
— T が配列型の場合、各要素はゼロで初期化されます。
— T が参照型の場合、初期化は実行されません。