首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能简单地初始化(用大括号) 2D std::array?

为什么不能简单地初始化(用大括号) 2D std::array?
EN

Stack Overflow用户
提问于 2012-10-11 16:42:04
回答 1查看 25.7K关注 0票数 55

可能重复: list behavior for std::vector and std::array are different

我定义了简单的2D数组(3X2):

代码语言:javascript
复制
  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>'

为什么我不能使用这个语法?

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

解决办法:

代码语言:javascript
复制
  // 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示例中:

代码语言:javascript
复制
struct B {
  int array[3];
};
struct A {
  B array[2];
};

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-11 16:50:25

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

代码语言:javascript
复制
std::array<int, 3> a1 = { { 1, 2, 3 } };

将此逻辑应用于2D数组将提供如下结果:

代码语言:javascript
复制
std::array<std::array<int, 3>, 2> a2 { { { {1, 2, 3} }, { { 4, 5, 6} } } };
//                                   ^ ^ ^ ^            ^ ^
//                                   | | | |            | |
//                                   | +-|-+------------|-+
//                                   +-|-+-|------------+---- C++ class braces
//                                     |   |
//                                     +---+--- member C array braces
票数 75
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12844475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档