質問: {0}; ``` などだと思うのですが、実行結果を見てみるとどちらの方法もゼロで3バイト分埋まっています。 c++的に正しいコードなんでしょうか? コンパイラはgcc 4.4.7です。
回答: 何を持って「正しい」と呼ぶか次第なところがありますが・・・ この記述は [c++11](/questions/tagged/c%2b%2b11 "'c++11' のタグが付いた質問を表示") で導入された「初期化子リスト」構文です。 - 波括弧 `{ }` が空でも良い - 直接初期化では `=` を書かない(ここで `=` を書くとコピー初期化になる) あたりが昔からの [c](/questions/tagged/c "'c' のタグが付いた質問を表示") [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") ユーザーには違和感があるところでしょうか。 よって [c++03](/questions/tagged/c%2b%2b03 "'c++03' のタグが付いた質問を表示") ではこの初期化子リストは使えません。 オイラの手元のワンチップマイコン開発環境で [c++11](/questions/tagged/c%2b%2b11 "'c++11' のタグが付いた質問を表示") に対応しているものは皆無なので、その意味でこの書き方は使えない書き方=正しくない、ということになります。同様、比較的新しい gcc では正しい書き方と言うことになります。 gcc-7.1.0 ではこんな挙動を示しました。 ``` $ g++ -c cpp11init.cpp # 無警告でコンパイルできた $ g++ -c -std=c++03 cppinit.cpp cppinit.cpp:3:16: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 char buf[3]{}; ^ $ ``` gcc-4.9.4 では `g++ -c cpp11init.cpp` で警告発生 `g++ -c -std=c++11 cpp11init.cpp` で警告なしとなりました。 何年付けの [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") 言語仕様書をベースにして話するかで正しくも誤りでもあります。話の前提条件の段階で [c++03](/questions/tagged/c%2b%2b03 "'c++03' のタグが付いた質問を表示") や [c++11](/questions/tagged/c%2b%2b11 "'c++11' のタグが付いた質問を表示") など規格書を指定する必要があるんでしょうね。