10

私はコードを持っています:

struct A {
    int a;
};

struct B {
    int b;
    const A a[2];
};

struct C {
    int c;
    const B b[2];
};

const C test = {0, {}};

int main()
{
    return test.c;
}

私は gcc 4.8.2 と 4.9.2 を持っています。次の方法で問題なくコンパイルできます。

g++-4.9 -Wall test.cpp -o test
g++-4.8 -std=c++11 -Wall test.cpp -o test
g++-4.8 -Wall test.cpp -o test

ただし、次のようにコンパイルすることはできません。

g++-4.9 -std=c++11 -Wall test.cpp -o test

コンパイラの出力は次のとおりです。

test.cpp:15:22: error: uninitialized const member ‘B::a’
 const C test = {0, {}};
                      ^
test.cpp:15:22: error: uninitialized const member ‘B::a’

これはバグですか、それとも私が何かを理解していないだけですか?

4

1 に答える 1

3

constこれは本質的に、集計の初期化で明示的に初期化されていないデータ メンバーに関する GCC の不平を言うバグです。例えば

struct {const int i;} bar = {};

iinの初期化子に初期化句がないため失敗barします。ただし、標準では次のように指定され§8.5.1/7ています

リスト内のinitializer-clausesが集約内のメンバーよりも少ない場合、明示的に初期化されていない各メンバーは、brace-or-equal-initializerから初期化されるか、またはbrace-or-equal-initializerない場合、空のイニシャライザ リスト (8.5.4) から

したがって、コードはi(あたかも byのように= {}) 初期化され、GCC の苦情は正しくありません。

実際、このバグは 4 年前に#49132として報告されており、GCC 5 で修正されています。

于 2015-04-07T15:50:45.167 に答える