C++0x 初始化列表
C++0x Initializer Lists
我需要一些帮助来理解 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 合并初始化列表的一些微妙之处。
为什么...
#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 标准。