c++ - 为什么不能简单初始化(带大括号)2D std::array?

标签 c++ stl c++11 initialization

这个问题在这里已经有了答案:




8年前关闭。




Possible Duplicate:
c++ why initializer_list behavior for std::vector and std::array are different



我定义了简单的二维数组(3X2):
  std::array<std::array<int,3>,2> a {
    {1,2,3},
    {4,5,6}
  };

我很惊讶这个初始化不起作用,gcc4.5 错误:too many initializers for 'std::array<std::array<int, 3u>, 2u>'
为什么我不能使用这种语法?

我找到了解决方法,一个非常有趣的额外括号,但只是想知道为什么第一种最简单的方法无效?

解决方法:
  // EXTRA BRACES
  std::array<std::array<int,3>,2> a {{
    {1,2,3},
    {4,5,6}
  }};

  // EXPLICIT CASTING
  std::array<std::array<int,3>,2> a {
    std::array<int,3>{1,2,3},
    std::array<int,3>{4,5,6}
  };

[更新]

好的,感谢 KerrekSB 和评论,我明白了。所以看起来我的例子中的大括号太少了,就像在这个 C 例子中一样:
struct B {
  int array[3];
};
struct A {
  B array[2];
};

B b = {{1,2,3}};
A a = {{
     {{1,2,3}},
     {{4,5,6}}
}};

最佳答案

std::array<T, N>是包含 C 数组的聚合。要初始化它,您需要类本身的外大括号和 C 数组的内大括号:

std::array<int, 3> a1 = { { 1, 2, 3 } };

将此逻辑应用于 2D 数组可得出以下结果:
std::array<std::array<int, 3>, 2> a2 { { { {1, 2, 3} }, { { 4, 5, 6} } } };
//                                   ^ ^ ^ ^            ^ ^
//                                   | | | |            | |
//                                   | +-|-+------------|-+
//                                   +-|-+-|------------+---- C++ class braces
//                                     |   |
//                                     +---+--- member C array braces

关于c++ - 为什么不能简单初始化(带大括号)2D std::array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62973141/

相关文章:

c++ - 名称表示相同的实体

c++ - block 矩阵转置

c++ - 如何让 WebSocket 服务器在 aws 上运行

c++ - 将 CStringArray 的内容复制到 std::vector

c++ - C++ 标准是否要求有符号整数只有一个符号位?

c++ - 为什么这种替换失败会产生错误?

c++ - 在 C++ 中初始化一对数组

c++ - 微调功能的性能

c++ - std::priority_queue 与 std::pair<int, int>

c++ - gcc 是否将 uint8_t 转换为单个值的 int?