将 std::array 与初始化列表一起使用:编译器难题
虽然将初始化列表与 std::array 一起使用的语法可能看起来像简单地说,一些用户在尝试实现它时遇到了困难。问题中提供的示例:
<code class="cpp">std::array<std::string, 2> strings = { "a", "b" };</code>
由于逗号之前的意外标记而导致 GCC 4.6.1 中出现编译错误。这种与 std::vector 的行为不一致(它毫无问题地接受初始化列表)导致了对语法有效性的混乱和猜测。
深入研究 std::array 的本质
要理解这种差异,有必要检查 std::array:
<code class="cpp">template<typename T, int size> struct std::array { T a[size]; };</code>
从这个定义可以明显看出,std::array 本质上是一个结构体包含一个数组。它缺少直接接受初始化列表的构造函数。但是,根据 C 11 的规则,std::array 被视为聚合。这允许聚合初始化,其中涉及间接初始化数组的元素。
克服语法谜
要使用聚合初始化成功初始化 std::array,需要一组额外的大括号:
<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>
通过嵌套大括号,编译器可以识别初始化结构中数组元素的意图。这消除了第一个示例中遇到的编译错误。
GCC 错误或标准不规则?
有趣的是,C 标准意味着在此可以省略额外的大括号具体案例。因此,GCC 4.6.1 可能遇到一个错误,无法正确解释简化语法。
以上是为什么在 GCC 4.6.1 中使用初始化列表初始化 std::array 会导致编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!