2012-01-14 74 views
12

A std::array<T>本质上是一个包装在struct中的C型阵列。 struct的初始化需要大括号,并且数组的初始化也需要大括号。所以,我需要2双括号:std :: array <T>初始化

std::array<int, 5> a = {{1, 2, 3, 4, 5}}; 

但大部分我所看到的例子代码只使用一对大括号:

std::array<int, 5> b = {1, 2, 3, 4, 5}; 

如何走到这是不能允许的,它有什么好处或与第一次接触相比有什么缺点?

+0

我不知道它_is_标准允许 - 可能接受该代码的编译器是基于早期的C^++ 11草案,或者只是给出一个警告,因为它是一个允许不合格代码的扩展。 – ildjarn 2012-01-14 15:55:57

+0

@ildjarn根据约翰内斯,它是允许的。 – fredoverflow 2012-01-14 16:10:21

回答

14

好处是你有...少打字。但缺点是只有在声明具有这种形式时,才允许你留下大括号。如果您离开=,或者如果阵列是成员,并且您使用member{{1, 2, 3, 4, 5}}初始化它,则不仅可以传递一对大括号。

这是因为当花括号传递给函数时,担心可能出现过载歧义,如f({{1, 2, 3, 4, 5}})。但是它引起了一些讨论并且生成了问题报告。

从本质上讲,= { ... }初始化一直是能够省略大括号,如

int a[][2] = { 1, 2, 3, 4 }; 

这不是新的。新的情况是,你可以省略=,但你必须指定所有牙套

int a[][2]{ {1, 2}, {3, 4} }; 
+0

你能提供一个标准的报价,证明只有一对大括号? – fredoverflow 2012-01-14 16:01:28

+1

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1270 – 2012-01-14 16:06:39

相关问题