このようなコードは正常に機能します。
char str[] = {'a', 'b', '\0'};
左は自動変数(配列)です。
このようなコードは機能しません:
char *str = {'a', 'b', '\0'};
左側がポインタです。ポインタが不明なスペースを指しているため、これは失敗します。
私の質問は、右側のタイプは何ですか?
C ++ 11では、初期化リストはになりstd::initializer_listます。しかし、古いC ++ 03はどうですか?
C ++ 03では、中括弧で囲まれた初期化子は、集合体(配列、特定の種類のクラスや構造体など)を初期化するために使用できる単なる構文デバイスです。'type'はなく、特定の種類の初期化子にのみ使用できます。
8.5.1 / 2「骨材」:
アグリゲートが初期化されると、イニシャライザーには、アグリゲートのメンバーのイニシャライザー句のコンマ区切りのリストで構成されるイニシャライザー句を含めることができます。このリストは、添え字またはメンバーの昇順で記述されます。
C ++ 03では、右側は初期化子リストです。タイプはなく、識別子の値を初期化する手段を提供する目的でのみ使用されます。
これは次のように定義されています。
C ++038.5.1イニシャライザー[dcl.init]
宣言者は、宣言される識別子の初期値を指定できます。識別子は、初期化されるオブジェクトまたは参照を指定します。8.5の残りの部分で説明されている初期化のプロセスは、引数式を使用した関数パラメーターの初期化(5.2.2)や戻り値の初期化(6.6.3)など、他の構文コンテキストによって指定された初期化にも適用されます。
initializer:
= initializer-clause
( expression-list )
initializer-clause:
assignment-expression
{ initializer-list ,opt }
{ }
initializer-list:
initializer-clause
initializer-list , initializer-clause
C ++ 11のドラフトから:
8.5イニシャライザー
16初期化子のセマンティクスは次のとおりです。デスティネーションタイプは初期化されるオブジェクトまたは参照のタイプであり、ソースタイプは初期化式のタイプです。イニシャライザがbraced-init-listの場合、または括弧で囲まれた式のリストの場合、ソースタイプは定義されません。
int num [3] = {1,2,3} ;
int num [0]= 1 ;
num [1]= 2 ;
num [2] = 3 ;