C++0x 初始化列表

标签 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
>


如果能澄清这一点,我将非常感激。我以为我会理解初始化列表,因为这个主题的第一次尝试是使用交叉编译器(它编译了代码的第一个版本,没有任何提示),但上述差异现在让我感到困惑。谢谢。

最佳答案

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

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

如果此代码无法使用您的编译器的 -std=c++11 标志进行编译,那是因为这个较旧的编译器尚未完全实现 C++1x 标准。

关于C++0x 初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34821581/

相关文章:

c - C 中动态内存分配(二维数组)的段错误

javascript通过属性检查在另一个对象数组中添加或替换对象

javascript - 从关联数组和长字符串构造 JavaScript 数组

c++ - 编译器错误 LKN2019 : Unresolved external symbol when dealing with inheritance

C++ 头文件 "symbol(s) not found"类错误

c++ - Bison 没有使用正确的 yylex 参数

c++ - 这是什么声明 `void func(bool b ...)` ?

c++ - 从 C++ 宏中删除额外的括号

c++ - 静态链接的boost库的动态链接错误

java - 为什么我不断收到错误: cannot find symbol for variables “weight” and “planet” ?