GCC 4.7がボーダーか?

以前のGCCでは、C++でも複合リテラルを使えていました。

たとえばこんな風にです。

std::puts((char[]) { 'a', 'b', 'c', '\0' });

ところが、今日たまたま同様のコードを試してみたところ、コンパイルエラーになるではありませんか? 試したバージョンは4.8.1でした。疑問に思ったので、古いバージョンでも試してみました。4.4や4.6では確かにコンパイルできます。

帰宅後、Atmel Studio 6.1のavr-gccが4.7.2だったのでこれで試してみました。するとコンパイルエラーになります。どうやら、4.6.xまではコンパイル可能、4.7.x以降はコンパイルエラーになるようです。

複合リテラルはC++の仕様ではなく、もともとはGCC拡張として実装されていたものが、C99から標準規格に導入された仕様です。しかし、C++11でも複合リテラルはC++に導入されませんでした。だからといって、それまで使えていた機能をいきなり廃止するのもどうかと思いますが、実際になくなってしまっています。

複合リテラル以外にも、初期化子中の要素指示子も使えなくなっています。結構大きな、しかも破壊的な変更だと思うのですが、ずいぶん思い切ったことをやりますね。