繁体   English   中英

为什么std :: vector和std :: array的C ++ initializer_list行为不同?

[英]Why is the C++ initializer_list behavior for std::vector and std::array different?

码:

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)的声明中被省略,也就是说,当使用旧样式= 允许括号省略的此规则不适用于直接列表初始化。 这里的脚注如下:“在列表初始化的其他用途中不能省略大括号。”

有关此限制的缺陷报告: CWG缺陷#1270 如果采用提议的解决方案,将允许使用大括号来进行其他形式的列表初始化,并且以下内容将是格式良好的:

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

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

因为std::vector提供了一个构造函数,它接受了一个std::initializer_list<T> ,而std::array没有构造函数,而{1, 2, 3, 4}支撑的init-list实际上并没有被解释为std::initializer_list ,但是std::array的内部C风格数组的聚合初始化(第二组括号来自的地方:一个用于std::array ,一个用于内部C风格的成员数组)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM