2016-08-09 6 views
3

構造体を作成するためにイニシャライザリストを使用すると、イニシャライザリストに構造体よりも少ない要素が含まれていると、残りの要素がゼロで初期化されています。構造体より少ない要素を持つC++初期化子リスト

私のコンパイラ(VS2015)が私のためにメモリをゼロにすることにしたので、これは未定義の動作ですか?

誰かがこの動作をC++で説明しているドキュメントを教えてくれますか?

これは私のコードです:

struct Thing { 
    int value; 
    int* ptr; 
}; 


void main() { 
    Thing thing { 5 }; 
    std::cout << thing.value << " " << thing.ptr << std::endl; 
} 

そして、これは、それが印刷さです:

5 00000000 

最後の要素は初期化子なしゼロしまったものであること。

+3

この '{5}'は最初の値 '5'と残りの '0'だけを設定します – DimChtz

+0

@DimChtzこれで配列を初期化するのと同じですか? int a [5] = {5}は、指定されていないすべての要素をゼロに設定します。 – MondKin

+0

@DimChtzドキュメント内でこれを検索する方法がわかっていますか? – MondKin

答えて

6

これは定義された動作です。 aggregate initializationのルールによれば、残りのメンバptrvalue-initializedとなる。すなわち、NULLポインタに対してzero-initializedである。

(強調鉱山)イニシャライザ句の数がに従い、残りのメンバーand bases (since C++17)が空リストによってby their default initializers, if provided in the class definition, and otherwise (since C++14)を完全に空に初期化されるメンバーand bases (since C++17)又は初期化子リストの数より少ない場合

通常のリスト初期化規則(非クラス型の場合は値の初期化を実行し、デフォルトのコンストラクタを使用した非集約クラスの場合は集計の初期化を行います)。参照タイプのメンバがこれらの残りのメンバの1つである場合、プログラムは不正な形式になります。

関連する問題