在C++中初始化一个二维数组

3

我试图在以下代码中初始化一个二维数组 -

int main(void)
{
    int arr[][5] = {
        [0][1] : 1, [0][0] : 2, [0][2] : 3,
    };
    cout<<a[0][0]<<" "<<a[0][1]<<endl;

    return 0;
}

但编译器给出了以下错误提示 -

./2d-arr.cpp: In function ‘int main()’:
./2d-arr.cpp:7:4: error: expected identifier before numeric constant
   [0][1] : 1, [0][0] : 2, [0][2] : 3,
    ^
./2d-arr.cpp: In lambda function:
./2d-arr.cpp:7:6: error: expected ‘{’ before ‘[’ token
   [0][1] : 1, [0][0] : 2, [0][2] : 3,
      ^
./2d-arr.cpp: In function ‘int main()’:
./2d-arr.cpp:7:6: error: no match for ‘operator[]’ (operand types are ‘main()::<lambda()>’ and ‘int’)
./2d-arr.cpp:7:10: error: expected ‘}’ before ‘:’ token
   [0][1] : 1, [0][0] : 2, [0][2] : 3,
          ^
./2d-arr.cpp: At global scope:
./2d-arr.cpp:9:2: error: ‘cout’ does not name a type
  cout<<a[0][0]<<" "<<a[0][1]<<endl;
  ^~~~
./2d-arr.cpp:11:2: error: expected unqualified-id before ‘returnreturn 0;
  ^~~~~~
./2d-arr.cpp:12:1: error: expected declaration before ‘}’ token
 }
 ^

如果我将“:”替换为“=”并使用gcc进行编译,那么它可以正常运行。通过搜索错误消息,我目前的理解是我们不能像在C中那样初始化数组。
是否有任何方法可以使上述代码适用于C++?


1
C语言从何时开始允许[0][1] : 1的写法? - Tony
2
@TonyTannous 自从1999年以来 ;) - Quentin
1
@Quentin 这就是我喜欢 Stack Overflow 的原因。你总是能学到新东西。虽然我从未见过一个例子……我应该搜索什么来找到一些呢? - Tony
1
@TonyTannous 这些被称为指定初始化器,然而 : 是编译器扩展 -- 标准的使用 = - Quentin
@Quentin 我知道在C99中支持指定初始化器,并在C++20中引入。奇怪的是冒号:, 现在我明白这是编译器扩展。 - Tony
@TonyTannous:为了用C编译,我把它改成了'='。 - golimoli
1个回答

0
我从这里找到了以下代码片段
它指出上述初始化在C++中是无效的。
struct A { int x, y; };
struct B { struct A a; };
struct A a = {.y = 1, .x = 2}; // valid C, invalid C++ (out of order)
**int arr[3] = {[1] = 5};        // valid C, invalid C++ (array)**
struct B b = {.a.x = 0};       // valid C, invalid C++ (nested)
struct A a = {.x = 1, 2};      // valid C, invalid C++ (mixed)

在C++中,使用[]进行指定初始化是不可能的,就像在C语言中一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接