std::array<T> 初始化

12

std::array<T>本质上是一个包裹在struct中的C风格数组。初始化struct需要花括号,而初始化数组也需要花括号。因此我需要两对花括号:

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

但是我看到的大多数示例代码只使用了一对花括号:

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

这种做法为什么被允许?与第一种方法相比,它有哪些好处或缺点?请注意保留HTML标签。

我不确定这是否符合标准 - 可能接受该代码的编译器基于早期的C++11草案,或者仅给出警告,因为它是允许不良形式的代码的扩展。 - ildjarn
据Johannes说,这是被允许的。 - fredoverflow
1个回答

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} };

你能提供一个标准的引用来证明只使用一对大括号的合理性吗? - fredoverflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接