You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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数组),由此可以解释不同写法的合法性:

  1. 前两种错误写法中,表达式列表的前几个元素都是int类型,无法直接初始化类型为int[3]的顶层数组元素,因此编译不通过。
  2. 第三种合法写法中,每个表达式都是符合int[3]初始化要求的带花括号的初始化列表,可以逐个匹配顶层元素完成初始化,同时编译器会自动推导未知边界数组的顶层长度为2,完全符合标准要求。

另外需要注意:常用的花括号聚合初始化中的「花括号省略」规则,仅适用于花括号列表初始化场景,标准并未为圆括号表达式列表初始化提供对应规则,因此不能直接照搬花括号初始化的用法。

内容的提问来源于stack exchange,提问作者Vlad from Moscow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 15:45:01