C++20中使用表达式列表初始化多维数组的写法是否正确?
结论
你提到的前两种多维数组初始化写法不符合C++20标准要求,属于非良构代码,第三种写法则是合法的。
不同写法的编译表现
- 错误写法1:
int a[][3]( 1, 2, 3, { 4, 5, 6 } );至少在MS VS 2019的C++编译器下无法编译 - 错误写法2:
int a[][3]( 1, 2, 3, 4, 5, 6 );同样无法编译 - 合法写法:
int a[][3]( { 1, 2, 3 }, { 4, 5, 6 } );可正常编译
标准依据与规则解释
C++20标准9.4节「初始化器」中与数组圆括号初始化相关的条文如下:
(17.5) —— 否则,若目标类型为数组,对象按如下规则初始化:设x₁, …, xₖ为表达式列表的元素。若目标类型为未知边界数组,则定义其包含k个元素。令n表示经上述潜在调整后的数组大小。若k大于n,程序非良构。否则,对每个1 ≤ i ≤ k,第i个数组元素以xᵢ复制初始化;对每个k < i ≤ n,第i个数组元素值初始化。对每个1 ≤ i < j ≤ n,与数组第i个元素初始化相关的所有值计算和副作用,都按序列排在第j个元素初始化相关的值计算和副作用之前。
该规则的核心逻辑是:圆括号初始化的表达式列表中,每个元素直接对应数组的顶层元素。你声明的int a[][3]是二维数组,它的顶层元素类型为int[3](长度为3的一维int数组),由此可以解释不同写法的合法性:
- 前两种错误写法中,表达式列表的前几个元素都是int类型,无法直接初始化类型为
int[3]的顶层数组元素,因此编译不通过。 - 第三种合法写法中,每个表达式都是符合
int[3]初始化要求的带花括号的初始化列表,可以逐个匹配顶层元素完成初始化,同时编译器会自动推导未知边界数组的顶层长度为2,完全符合标准要求。
另外需要注意:常用的花括号聚合初始化中的「花括号省略」规则,仅适用于花括号列表初始化场景,标准并未为圆括号表达式列表初始化提供对应规则,因此不能直接照搬花括号初始化的用法。
内容的提问来源于stack exchange,提问作者Vlad from Moscow
相关产品推荐
相关产品推荐

