文字列リテラルの初期化から統一初期化構文と複合リテラルへの話
std::initializer_list<int> じゃないですか? RT @melponn: { 1, 2, 3} 自体が何の型になるのかが仕様から分からない・・・
2010-03-11 02:54:42もしかして (int[]) 型の値として{1,2,3}が認識されているから、これは実はキャストでも何でもない、ということか?どこにそんな文法を許容するという文言が書いたあるんや!!!
2010-03-11 02:55:24というかg++ -pedantic -std=c++0x でふつうに error: ISO C++ forbids compound-literalsとかいわれますた
2010-03-11 02:57:48(int[]){1, 2, 3, 4}; (std::vector<int>){1, 2, 3, 4}; (std::array<int, 4>){1, 2, 3, 4}と並べてコンパイルが通ったら、そりゃ3つとも同じ構文だと思い込むよ……。
2010-03-11 03:00:49うーん、C++03 の仕様上だと無理だから新しい初期化リストの構文だと解釈されてるんだろうけど、std::initializer_list は int[] への変換を持ってないだろうし・・・いやほんとか?
2010-03-11 03:04:16あ、std::vector<int>{1, 2, 3, 4}; std::array<int, 4>{1, 2, 3, 4};でもコンパイル通る。ごめんなさい。
2010-03-11 03:05:09でもtypedef int arr_t[4]; arr_t{1, 2, 3, 4};もいけるぞ。int[]{1, 2, 3, 4};はエラー。
2010-03-11 03:06:40@yak_ex 一応 declaration-statement において、 braced-init-list が登場できる文脈を調べたのですが、(int[]){1,2,3})がwell-formedである、と言える文言は見つからないです。
2010-03-11 03:06:44@egtra arr_t{1,2,3}はあれですね、uniform initialization syntaxですね。
2010-03-11 03:10:56@DecimalBloat simple type specifier の場合なら、5.2.3p3 だけど、int[] は simple type specifier じゃないだろってことですか。
2010-03-11 03:15:44@melponn 自分が使っているg++ 4.4.1 (MinGW TDM)だと-pedantic付けない限り、-std=c++98でも(int[]){1, 2, 3}は警告1つ出さないです。
2010-03-11 03:33:37@egtra あ、自分も (int[]){1, 2, 3}; だけだと怒られなくて、int n[] = (int[]){1, 2, 3}; ってやったら怒られました・・・。もうやだC++・・・
2010-03-11 03:35:33