2013-02-10 93 views
2

在下面的代码C++的std ::阵列警告

std::array<int,3> myarray = {10,20,30}; 

我收到以下编译器警告

warning: missing braces around initializer for ‘std::array<int, 3u>::value_type [3] {aka int [3]}’ [-Wmissing-braces] 

为什么?

工具链:(编辑)

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 
Copyright (C) 2011 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+0

我们应该*猜测*您正在使用什么工具链? – WhozCraig 2013-02-10 03:48:19

+0

@WhozCraig编辑 – 2013-02-10 03:49:39

+0

谢谢。它的确有所作为。 – WhozCraig 2013-02-10 03:50:28

回答

5

试试这个:

std::array<int,3> = {{10, 20, 30}}

我认为这是他们固定版本的bug,> 4.6

+0

谢谢,这个作品。但为什么 ?这是怎么回事 ? – 2013-02-10 03:50:59

+0

看起来好像是一个bug ** – thang 2013-02-10 04:46:55

4

正如泰勒指出,std::array是一个POD,所以它没有构造函数,它包含一个数组。要用括号语法初始化它,首先使用嵌套大括号将变量初始化,然后初始化变量内的数组。

{ { 10, 20, 30 } } 
^For the array member variable inside the std::array object 
^ For the std::array object 

其实这是你的编译器错误,因为总初始化允许您将=后去除牙套层。所以这两个是合法的:

std::array<int,3> x = {10, 20, 30}; 
std::array<int,3> y {{10, 20, 30}}; 

但不是

std::array<int,3> z {10, 20, 30}; 

最后一个在GCC编译,但它是一个非标准扩展,你应该得到一个警告。

+0

没错,很好的表演。 – 2013-02-10 03:52:35

+0

虽然只能在g ++ 4.7上使用一对大括号。 – us2012 2013-02-10 03:53:07

+0

工程单支架以及我的Mac,LLVM 4.2。因此,我问他有什么链条的原因。 – WhozCraig 2013-02-10 03:54:00