在C++11中,如何通过初始化列表初始化多维std::array?

14
我试图通过初始化列表来初始化一个二维std::array,但编译器告诉我有太多的初始值。
例如:
std::array<std::array<int, 2>, 2> shape = { {1, 1},
                                            {1, 1} };

编译器错误: 错误:对于'std::array<std::array<int, 2ul>, 2ul>'有太多的初始化程序

但显然没有太多。我做错了什么吗?

2个回答

14

尝试添加一个额外的 {} 来确保我们初始化内部的 C 数组。

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

或者直接删除所有括号。

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

对我来说,我们必须这样做总是感觉像是一个抽象泄漏。我想这只是库不是语言的“内部”而是与之一起构建的结果。 - Lightness Races in Orbit
1
刚试了一下,如果你不想看到警告,可以使用std::array<std::array<int, 2>, 2> shape = {{ {{1, 1}}, {{1, 1}} }};。呃。。。 - Jeff

7

我建议(即使我没有尝试过,所以可能是错的)

typedef std::array<int, 2> row;
std::array<row,2> shape = { row {1,1}, row {1,1} };

1
它能工作,但我想知道为什么我的版本不行。两个表达式在第一眼看起来似乎是等价的。 - Mihai Bişog
@zoopp:不,他们不一样。Basile使用了显式的结构,而你没有。 - Lightness Races in Orbit

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