为什么std :: vector和std :: array的C ++ initializer_list行为不同?
码:
std::vector<int> x{1,2,3,4}; std::array<int, 4> y{{1,2,3,4}};
为什么我需要双花括号为std ::数组?
std::array<T, N>
是一个集合:它没有任何用户声明的构造函数,甚至没有一个采用std::initializer_list
。 使用大括号进行初始化是使用聚合初始化进行的 ,这是从Cinheritance的C ++特性。
聚合初始化的“旧式”使用=
:
std::array<int, 4> y = { { 1, 2, 3, 4 } };
使用这种旧的聚合初始化方式,可以省去额外的大括号,所以这相当于:
std::array<int, 4> y = { 1, 2, 3, 4 };
但是,这些额外的大括号只能在“ T x = { a };
”forms的声明中被忽略掉(C ++ 11§8.5.1/ 11),也就是说,当使用旧的style =
。 允许大括号的规则不适用于直接列表初始化。 这里的脚注如下:“在其他使用列表初始化的过程中不能忽略大括号”。
有关于此限制的缺陷报告: CWG缺陷#1270 。 如果采纳提议的决议,则允许使用大括号作为其他forms的列表初始化,以下内容将是完整的:
std::array<int, 4> y{ 1, 2, 3, 4 };
(为了find缺陷报告,请向Ville Voutilainen提供信息。)
因为std::vector
提供了一个构造函数来接受std::initializer_list<T>
,而std::array
没有构造函数,而{1, 2, 3, 4}
加载的init-list实际上并不被解释为std::initializer_list
,但聚合初始化的内部C风格的数组std::array
(这是第二套大括号来自:一个为std::array
,一个为内部的C样式成员数组)。