文字列リテラルの初期化から統一初期化構文と複合リテラルへの話
C++0x で char* p = "hoge"; はできないけど char p[] = "hoge"; はできるっぽい?そうなると array-to-pointer 変換で char* にもできそうな気がするけど・・・
2010-03-11 01:19:09@melponn char p[] = "hoge";はchar p[] = {'h','o','g','e','\0'};の糖衣構文と考えれば、int a[] = {1,2,3}; int* p = a;ができてもint* p = {1,2,3};がダメなのと同じ理屈だと思う
2010-03-11 01:25:59そもそも string literal が array of n const char なのにどこの仕様で char[] に格納できようになってるのかも気になって仕方がない・・・
2010-03-11 01:33:11ああ、なるほど、これで初期化することはできるけど、string literal 自体は const char[] だから char* への変換はできないのね。
2010-03-11 01:40:17うひょー、int *p = (int[]){1, 2, 3, 4};ってコードがC99だけでなくC++0xでも通るのか?g++ 4.4.1でエラーにならないぞ。
2010-03-11 01:40:36なんだ、この呪文みたいなコードはRT: @egtra: うひょー、int *p = (int[]){1, 2, 3, 4};ってコードがC99だけでなくC++0xでも通るのか?g++ 4.4.1でエラーにならないぞ。
2010-03-11 01:46:27規格を読んでも int * p = (int[]){1,2,3}; が well-formed である理由は見あたらない…
2010-03-11 02:19:26int *p = ((int[]){1,2});これ試しにg++4.3.3に食わしてみたけど、ポインタ経由でp[0]++とかもできるですね
2010-03-11 02:31:06(int[]){1, 2, 3}がC++0xで合法だったとして、おそらくスコープは一時オブジェクトだよなあと想像。これからドラフト見てくる。
2010-03-11 02:38:49お禿げ様はC99 style initializersはWe don’t propose to accept themとか言ってるようだけども?struct S{int x;}; S *p= &((S){1};はさすがに一時オブジェクトのあどれすーって警告出る(gccでは出ない)
2010-03-11 02:42:18