15

次のコードを検討してください。

#include <array>

struct A
{
    int a;
    int b;
};

static std::array<A, 4> x1 =
{
        { 1, 2 },
        { 3, 4 },
        { 5, 6 },
        { 7, 8 }
};

static std::array<A, 4> x2 =
{
    {
        { 1, 2 },
        { 3, 4 },
        { 5, 6 },
        { 7, 8 }
    }
};

static std::array<A, 4> x3 =
{
       A{ 1, 2 },
       A{ 3, 4 },
       A{ 5, 6 },
       A{ 7, 8 }
};

static std::array<A, 4> x4 =
{
       A{ 1, 2 },
        { 3, 4 },
        { 5, 6 },
        { 7, 8 }
};

gcc でコンパイル:

$ gcc -c --std=c++11 array.cpp
array.cpp:15:1: error: too many initializers for ‘std::array<A, 4ul>’
 };
 ^
$

NB1: 最初の初期化ステートメントをコメントアウトすると、コードはエラーなしでコンパイルされます。
NB2: すべての初期化をコンストラクター呼び出しに変換すると、同じ結果が得られます。
NB3: MSVC2015 は同じように動作します。

最初の初期化がコンパイルに失敗する理由と、2 番目と 3 番目の初期化が問題ない理由がわかります。(例: C++11: 正しい std::array の初期化?を参照してください。)

私の質問は次のとおりです。最終的な初期化がコンパイルされるのはなぜですか?

4

1 に答える 1