複合リテラル とは、初期化指定子リストで与えられる 値を持ち、かつ名前の付けられていないオブジェクトを指定するための接尾辞式です。 初期化指定子リストの式は定数であってもかまいません。C99 言語 フィーチャーを使用すると、初期化指定子および式で複合定数を使用して、集合体型 または共用体型の定数を指定することができます。これらの型の内の 1 つのインスタンスが 一度しか使用されない場合は、複合リテラルを使用することで、一時変数を使用する必要がな くなりま す。C++ は、C と互換性を持たせるための、Standard C++ への拡張機能として、このフィーチャーをサポートします。
複合リテラルの構文はキャスト式の構文に似ています。 ただし、複合リテラルが左辺値であるのに対し、キャスト式の結果は左辺値ではありません。さらに、 キャストはスカラー型または void にしか変換できませんが、複合リテラルは指定された型の オブジェクトになります。構文は以下のとおりです。
>>-(--type_name--)--{--+-initializer_list----+--}-------------->< '-initializer_list--,-'
サイズが不明の配列型の場合、そのサイズは初期化指定子リストによって決まります。
複合リテラルは、関数の本体の外で使用されている場合は、静的ストレージ期間を持ちます。 初期化指定子リストは定数式で構成されます。それ以外の場合は、複合リテラルは それを含むブロックに関連付けられている自動ストレージ期間を持ちます。次の式の意味はそれぞれ違います。 複合リテラルは、関数の本体内で使用されると、自動ストレージ期間を持ちます。
"string" /* an array of char with static storage duration */ (char[]){"string"} /* modifiable */ (const char[]){"string"} /* not modifiable */
const 修飾された複合リテラルは、読み取り専用メモリー内に配置できます。 const 修飾された型を持つ複合リテラルは、同じ表記または重複表記を持つストリング・リテラルと、 ストレージを共用できます。例えば、次のような場合です。
(const char[]){"string"} == "string"
ストレージを共有している場合、1 が生成される可能性があります。ただし、const 修飾された型を持つ複合リテラルは 必ずしも共用されません。 次の式は、struct s 型の 2 つの異なるオブジェクトになります。
(const struct s){1,2,3} (const struct s){1,2,3}
ベクトル型を持っている複合リテラルは、通常の複合リテラルと同じセマンティック規則に従います。
vector unsigned int v1 = (vector unsigned int) {1,2,3,4};複合リテラルは、定数式ではないため、 静的変数の初期化には使用できません。 ただし、GNU C/C++ との互換性を保つため、ベクトル型を持つ静的変数は、初期化指定子リスト 内のすべての初期化指定子が定数式であれば、同じベクトル型の複合リテラルによって初期化することができます。
関連参照