为什么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 :: array?

std :: array< T,N>是一个聚合:它没有任何用户声明的构造函数,甚至没有一个std :: initializer_list。使用大括号的初始化是使用聚合初始化执行的,C是继承自C的特征。

聚合初始化的“旧样式”使用=:

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

使用这种旧式的聚合初始化,可以省略额外的大括号,因此这等价于:

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

但是,这些额外的大括号只能在形式为T x = {a};“ (C 11§8.5.1/ 11),即当使用old style =时。允许括号删除的此规则不适用于直接列表初始化。这里的脚注如下:“大括号不能在列表初始化的其他使用中省略。

有一个关于这个限制的缺陷报告:CWG defect #1270.如果采用提议的分辨率,则允许大括号删除其他形式的列表初始化,并且以下将是良好的:

std::array<int, 4> y{ 1, 2, 3, 4 };

(帽子提示Ville Voutilainen找到缺陷报告。)

http://stackoverflow.com/questions/11400090/why-is-the-c-initializer-list-behavior-for-stdvector-and-stdarray-differen

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:为什么std :: vector和std :: array的C initializer_list行为不同?