std::array 中的大括号省略

2023-11-24

我正在编译使用g++对于 C++ 17。我有以下内容:

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

我不明白为什么如果我删除数组的双大括号不再起作用。

std::array<std::vector<int>, 2> v = { {1,2}, {3,4} }; // Does not compile

我明白如何std::array一般情况下都有效并且需要双大括号,但当我为 C++17 进行编译时,我预计大括号省略会发挥作用。

为什么大括号省略在这里不适用?


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 因为它们没有类型,实际上也不允许“双括号”,因为这只是具有单个元素的特殊情况大括号初始化列表 .

在这个领域,我们最好用代码来指定它。核心语言规则无法用简单的文字来规范,并且实现细节将会泄露——而且已经这样做了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::array 中的大括号省略 的相关文章

随机推荐