std::array<std::vector<int>, 2>
是有效地
struct array {
std::vector<int> elems[2];
};
elems
是一个子集合就好了。问题是,根据语言规则,如果初始化程序以{
总是假设您没有省略大括号;反而,{1, 2}
被视为整个子聚合的初始化器elems
,尝试用以下方式初始化其第一个元素1
和第二个元素2
(这显然是无效的 - 你不能将整数转换为vector
- 但不影响解释),并且{3, 4}
被认为是之后的事物的初始化程序elems
- 由于没有这样的东西,这是另一个错误。
用不是 a 的东西初始化第一个元素大括号初始化列表足以触发大括号省略:
std::array<std::vector<int>, 2> v = { std::vector<int>{1,2}, {3,4} };
请注意,从规范的角度来看,该库不保证初始化std::array<T, N>
来自除另一个之外的任何事物std::array<T, N>
或“最多 N 个元素的列表,其类型可转换为T
“。这特别排除了大括号初始化列表s 因为它们没有类型,实际上也不允许“双括号”,因为这只是具有单个元素的特殊情况大括号初始化列表 .
在这个领域,我们最好用代码来指定它。核心语言规则无法用简单的文字来规范,并且实现细节将会泄露——而且已经这样做了。