【问题标题】:Initializing a multi-dimensional array in C++ 20 using an expression list使用表达式列表在 C++ 20 中初始化多维数组
【发布时间】: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


【解决方案1】:

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

对于每个 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 } );

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

【讨论】:

    【解决方案2】:

    取自c++ 20 draft

    7.6.1
    expression-list:
      initializer-list
    
    9.4
    initializer-clause :
       assignment-expression
       braced-init-list
    
    initializer-list:
       initializer-clause ...opt
       initializer-list , initializer-clause ...opt
    

    a[][2]({1, 2, 3}, {4, 5, 6})没问题

    a[][2](1, 2, 3, {4, 5, 6}) 不行,因为 1, 2, 3, {4, 5, 6} 不是表达式列表

    这意味着数组的 () 语法是没有意义的,反正内部需要是一个 {} 除了:

    int e[](1);

    因为 1 是一个赋值表达式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2011-06-05
      • 2011-04-03
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多