首页 >后端开发 >C++ >为什么使用初始值设定项列表初始化 std::array 时会出现编译错误?

为什么使用初始值设定项列表初始化 std::array 时会出现编译错误?

Linda Hamilton
Linda Hamilton原创
2024-10-29 08:15:30695浏览

Why Do I Get Compilation Errors When Initializing a std::array with an Initializer List?

将 std::array 与初始化列表结合使用:解决语法之谜

在 C 数据结构领域,std::array 代表其固定大小的内存分配。虽然它的多功能性允许使用初始化列表进行初始化,但可能会出现一些意想不到的挑战。

语法 Enigma

根据查询,尝试初始化 std::array使用初始化列表(如下所示)会导致编译错误:

<code class="cpp">std::array<std::string, 2> strings = { "a", "b" };
std::array<std::string, 2> strings({ "a", "b" });</code>

但是,初始化列表可以与 std::vector 无缝运行。这种差异引发了一个问题:这是对 std::array 功能的误解还是 GNU 标准 C 库实现中的缺陷?

揭开解决方案

背后场景中,std::array 被构造为一个结构体:

<code class="cpp">template<typename T, int size>
struct std::array
{
  T a[size];
};</code>

这个结构体封装了一个数组,但奇怪的是,它缺少一个接受初始化列表的构造函数。尽管如此,由于 std::array 在 C 11 中符合聚合条件,因此聚合初始化成为一种替代方法。

要完成聚合初始化,需要一组额外的花括号来定位结构中的数组:

<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>

编译器异常

C 标准表明上例中的附加花括号是可有可无的。然而,遇到的编译器错误表明 GCC 实现中存在潜在错误,无法识别聚合初始化。

结论

虽然这个问题一开始可能看起来令人困惑乍一看,关键在于理解 std::array 的底层结构以及聚合初始化的复杂性。双大括号语法解决了编译错误,并允许使用初始值设定项列表创建 std::arrays,如 C 标准所示。

以上是为什么使用初始值设定项列表初始化 std::array 时会出现编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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