【发布时间】:2021-07-26 22:23:41
【问题描述】:
在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,则程序为 格式不正确。否则,第 i 个数组元素被复制初始化为 xi 对于每个 1 ≤ i ≤ k,并且对每个 k
【问题讨论】:
-
看起来有点可疑。您是否启用了 pedantic 标志(无论 CL.EXE 是什么)?
language-lawyer标签? -
被 clang、gcc 和 msvc 拒绝 - 直播 - godbolt.org/z/EzE37dr6j 你能发一个链接到“表达式列表”很难确定。
-
要走的路是:int a[][3]{ {2}, {3}, { 4, 5, 6 }}; (猜你希望第一个维度是 4)。
-
@phe 注意我说的是一个表达式列表,你的例子应该看起来像 int a[][3]( {2}, {3}, { 4, 5, 6 }); (外括号代替大括号)
-
@phe 带大括号(列表初始化)这个声明 int a[][3]{ 1, 2, 3, { 4, 5, 6 } };已验证。没有问题
标签: c++ multidimensional-array initialization declaration c++20