【发布时间】:2021-09-27 13:49:50
【问题描述】:
在初始化二维数组时我们可以这样做
int data[2][2] = {{1, 2}, {3, 4}}; // OK
我们也可以使用
int data[2][2] = {1, 2, 3, 4}; // OK
这是有道理的,因为二维数组仍然是一块连续的内存。
当使用数组类而不是基类型时,这是可行的
array<array<int, 2>, 2> data = {1, 2, 3, 4}; // OK
这又是有道理的,因为数组类没有任何额外的数据,并且最终也是一个连续的内存块。
但是二维列表不起作用:
array<array<int, 2>, 2> data = {{1, 2}, {3, 4}}; // Error
我也可以初始化这个
vector<array<int, 2>> data = {{1, 2}, {3, 4}}; // OK
但无论如何都找不到初始化:
array<vector<int>, 2> = ????
我的问题是:
这是否有一个基本的设计原因(我的猜测是与编译时和运行时发生的事情有关)?或者这只是我正在使用的编译器 (GCC) 的实现决策?
【问题讨论】:
-
std::array<std::array<int, 2>, 2> a = {{{1, 2}, {3, 4}}};你需要使用双括号初始化。 -
编辑: 2 维和 3 维示例:ideone.com/ugs1E6 > 1 维需要双括号初始化。这是在
CWG 1270 revision之前,我从这里给出的示例中读到:en.cppreference.com/w/cpp/container/array 显然它曾经是一维所必需的。 -
vector有一个显式构造函数,所以如果你有一个向量数组,你必须为每个子元素写出vector{1, 2}等
标签: c++ arrays vector stl list-initialization