c++ - 使用表达式列表在 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 个元素的初始化相关的那些之前。
解决方案
重读提供的报价,尤其是这部分
对于每个 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 } );
在大括号初始化列表中,可以使用大括号省略。
推荐阅读
- python - 获取组的最后一个值并将该值设置为下一组
- linux - 如何将运行程序的结果写入日志文件中,该日志文件每天都会更改名称(文件名中的日期)?
- java - 用于 tomcat 日志的 Webhook
- ios - 识别点击但将其他手势转发到另一个视图
- java - 将自定义方法添加为组件的关键侦听器
- matplotlib - Matplotlib 2 堆叠子图,无法设置两个 ytick 标签的大小
- python - 如何在 Pandas 中使用需要两个向量的函数 apply
- c++ - 为什么在我的 C++ 代码中调用函数后“n”没有更新?
- macos-mojave - 是否有可靠的方法在运行的 macOS Mojave 系统之间进行文件共享?
- three.js - Three.js TAA 与 MeshStandardMaterial