Astd::array<T>
本质上是一个包裹在struct
. s的初始化struct
需要大括号,数组的初始化也需要大括号。所以我需要两对大括号:
std::array<int, 5> a = {{1, 2, 3, 4, 5}};
但是我看到的大多数示例代码只使用了一对大括号:
std::array<int, 5> b = {1, 2, 3, 4, 5};
为什么这是允许的,与第一种方法相比,它有什么好处或缺点吗?
Astd::array<T>
本质上是一个包裹在struct
. s的初始化struct
需要大括号,数组的初始化也需要大括号。所以我需要两对大括号:
std::array<int, 5> a = {{1, 2, 3, 4, 5}};
但是我看到的大多数示例代码只使用了一对大括号:
std::array<int, 5> b = {1, 2, 3, 4, 5};
为什么这是允许的,与第一种方法相比,它有什么好处或缺点吗?
好处是你有……更少的打字。但缺点是只有在声明具有该形式时才允许您省略大括号。如果你不使用=
,或者如果数组是一个成员并且你用 初始化它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} };