首页  >  文章  >  后端开发  >  为什么 std::array 需要双花括号来初始化列表,而 std::vector 不需要?

为什么 std::array 需要双花括号来初始化列表,而 std::vector 不需要?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-07 03:40:03741浏览

Why does std::array require double curly braces for initializer lists while std::vector doesn't?

std::vector 和 std::array 的 C Initializer_List 行为差异

当对 C 容器使用初始值设定项列表时,std::vector 和 std::vector 之间会出现令人困惑的差异std::数组。让我们探讨一下这种行为背后的原因。

问题:

考虑以下代码:

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

为什么需要使用双卷曲

答案:

该行为源于 std::array 的本质。作为一个总体。聚合没有用户声明的构造函数,包括接受初始值设定项列表的构造函数。因此,std::array 的聚合初始化是通过使用 = 语法的“旧式”初始化来执行的:

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

在这种旧式中,可以省略额外的大括号,从而产生等效的代码:

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

但是,只有在使用 = 语法的旧式初始化时才允许省略大括号。直接列表初始化不使用 = 语法,不允许省略大括号。此限制受 C 11 §8.5.1/11 管辖。

提议的解决方案:

已提出缺陷报告(CWG 缺陷 #1270)来解决此问题局限性。如果建议的解决方案被采纳,所有形式的列表初始化都将允许大括号省略,包括以下内容:

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

此更改将为 std::vector 和 std::array 的行为带来一致性使用初始值设定项列表时。

以上是为什么 std::array 需要双花括号来初始化列表,而 std::vector 不需要?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn