

char配列の宣言時に

[code]

    char buf[3] {};
    
[/code]

としているコードを見ました。

自分の中では

[code]

    char buf[3] = {0};
    
[/code]

などだと思うのですが、実行結果を見てみるとどちらの方法もゼロで3バイト分埋まっています。

c++的に正しいコードなんでしょうか？  
コンパイラはgcc 4.4.7です。


CC BY-SA 3.0
2017-08-09T05:13:35.130
37044
2017-08-09T07:32:10.023
2017-08-09T07:32:10.023
49
24804
question
c++
c++の配列の初期化方法


何を持って「正しい」と呼ぶか次第なところがありますが・・・

この記述は [c++11](/questions/tagged/c%2b%2b11 "'c++11' のタグが付いた質問を表示")
で導入された「初期化子リスト」構文です。  
<https://cpprefjp.github.io/lang/cpp11/initializer_lists.html>  
\- 波括弧 `{ }` が空でも良い  
\- 直接初期化では `=` を書かない（ここで `=` を書くとコピー初期化になる）  
あたりが昔からの [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 ではこんな挙動を示しました。

[code]

    $ 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]{};
                  ^
    $
    
[/code]

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'
のタグが付いた質問を表示") など規格書を指定する必要があるんでしょうね。


CC BY-SA 3.0
2017-08-09T06:40:08.117
37052
2017-08-09T06:40:08.117
8589
37044
answer