嵌套的初始化程序列表不像我期望的那样构造嵌套数组

时间:2016-05-12 13:57:07

标签: c++ initializer-list

我有以下代码:

#include <iostream>
#include <vector>
#include <array>

using namespace std;

int main()
{
    std::vector<std::array<std::array<double, 3>, 2>> arr =
    {
      {
        {2, 1, 0},
        {1, 1, 0}
      }
    };

    cout << "Array size " << arr.size() << endl;
}

我希望这会返回一个大小为1的向量,包含看起来像这样的2d数组:

[
  [[2, 1, 0], [1, 1, 0]]
]

然而,它返回一个大小为2的向量,其中两个数组如下所示:

[
  [[2, 1, 0], [0, 0, 0]],
  [[1, 1, 0], [0, 0, 0]]
]

在我看来它应该能够构造两个内部大小为3的数组,然后使用它来构造单个大小的2数组以将其放入向量中。

我很困惑。任何帮助解释为什么这不符合我的预期会很棒。

在Visual Studio Online Compiler和Clang中测试。

1 个答案:

答案 0 :(得分:1)

std::arrayaggregate type,它没有带initializer-list的构造函数,因此每个std::array需要两个括号:

std::vector<std::array<std::array<double, 3>, 2>> arr =
{
  {{
    {{2, 1, 0}},
    {{1, 1, 0}}
  }}
};

您可以在g ++中使用-Wmissing-braces启用此类警告(默认情况下,clang会在-Wall处启用此警告)。