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