码:
std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
为什么为std :: array需要双花括号?
码:
std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
为什么为std :: array需要双花括号?
-Werror
无论如何,我都会使用自己编写的代码,因此它不会损害我的可移植性。如果其他人是轻量级的,或者需要包括由轻量级的人编写的头文件,则里程数可能会有所不同:-)
Answers:
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提交有关查找缺陷报告的提示)。
array
吗?
std::array<int> y = {1,2,3,4};
与Clang的警告一起建议使用括号,而不是关于不允许“使用直接列表初始化时在子对象的初始化周围省略括号”的硬错误。
std::array
,还是只是收到警告?std::array<int,4> y{1,2,3,4};
为我工作。