首页 > 解决方案 > 使用表达式列表在 C++ 20 中初始化多维数组

问题描述

使用表达式列表在 C++ 20 中对多维数组进行这种初始化是否正确?

int a[][3]( 1, 2, 3, { 4, 5, 6 } );

至少 MS VS 2019 的 C++ 编译器不会编译这样的声明

本声明

int a[][3]( 1, 2, 3, 4, 5, 6 );

在此声明时也不会编译

int a[][3]( { 1, 2, 3 }, { 4, 5, 6 } );

编译成功。

在与数组初始化相关的 C++ 20 标准(9.4 初始化程序)的相应引用中,没有说明在使用表达式列表时是否允许大括号省略。

(17.5) — 否则,如果目标类型是数组,则按如下方式初始化对象。让 x1, . . . , xk 是表达式列表的元素。如果目标类型是未知边界的数组,则将其定义为具有 k 个元素。让 n 表示此潜在调整后的数组大小。如果 k 大于 n,则程序是非良构的。否则,对于每个 1 ≤ i ≤ k,第 i 个数组元素使用 xi 进行复制初始化,并且对于每个 k < i ≤ n 进行值初始化。对于每个 1 ≤ i < j ≤ n,与数组的第 i 个元素的初始化相关的每个值计算和副作用都排在与第 j 个元素的初始化相关的那些之前。

标签: c++multidimensional-arrayinitializationdeclarationc++20

解决方案


重读提供的报价,尤其是这部分

对于每个 1 ≤ i ≤ k,第 i 个数组元素使用 xi 进行复制初始化

好像这样的初始化

int a[][3]( 1, 2, 3, { 4, 5, 6 } );

确实是不正确的,因为数组的元素a又是该类型的数组,int[3]并且在这种情况下要对其进行初始化,您需要使用花括号初始化列表。之后,在大括号初始化列表中,大括号省略将被接受。也就是说,您可能不会使用表达式初始化数组。

这是一个证实这一点的例子,由 MS VS 2019 的 C++ 编译器编译

int e[][2][3]( { 1, 2, 3,  { 4, 5, 6 } }, { 6, 5, 4, 3, 2, 1 } );

在大括号初始化列表中,可以使用大括号省略。


推荐阅读