当对 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<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中文网其他相关文章!