C ++ 0x初始化列表

时间:2016-01-15 23:25:53

标签: c++ arrays compiler-errors initializer-list

我需要一些帮助来理解C ++ 0x整合初始化列表的一些细微之处。

为什么......

#include <iostream>

int main()
{
    struct Foo
    {
        public:
            struct Bar
            {
                public:
                    Bar(int a, int b, int c){}

                    int ma, mb, mc;
            } mBar[2];

            Foo(int a, int b, int c)
            : mBar{{a, b, c},
                   {a+10, b+10, c+10}}
            {}
    } mFoo(1, 2, 3);

    return 0;
}

...导致此编译器错误...

>g++ -std=c++0x main.cpp
main.cpp: In constructor ‘main()::Foo::Foo(int, int, int)’:
main.cpp:18: error: bad array initializer
>

......而这......

#include <iostream>

int main()
{
    struct Foo
    {
        public:
            struct Bar
            {
                public:
////////////////////Bar(int a, int b, int c){}

                    int ma, mb, mc;
            } mBar[2];

            Foo(int a, int b, int c)
            : mBar{{a, b, c},
                   {a+10, b+10, c+10}}
            {}
    } mFoo(1, 2, 3);

    return 0;
}

......不......

>g++ -std=c++0x main.cpp
>

...如果我用不同的编译器编译上面代码的第一个版本,它会编译......

>/opt/mv_7/arm/tools/arm-gnu/bin/arm-montavista-linux-gnueabi-g++ -std=c++0x main.cpp
>


我非常感谢清楚这一点。我以为我会理解初始化列表,因为这个主题的第一次尝试是使用交叉编译器(编译第一版代码而没有抱怨),但上面的差异让我感到困惑。谢谢。

1 个答案:

答案 0 :(得分:3)

在评论中,您表示您使用的是gcc 4.4.7。

这是一个相对较旧的编译器。在-std = c ++ 14模式下使用gcc 5.3.1编译给定代码没有问题。

如果此代码不能与编译器一起使用-std = c ++ 11标志进行编译,那么因为这个较旧的编译器还没有完全实现C ++ 1x标准。