多维数组和向量的初始化列表

问题描述

我想为我的向量和数组使用初始化列表。最终,我想初始化某个 A 类的向量数组,但是在遇到奇怪的编译器错误时我没有到达那里。这是一些代码

#include <vector>
#include <array>

class A {
    public:
        A(int x_,int y_): x(x_),y(y_) {}
    private:
        int x;
        int y;
};

int main() {
    auto data = std::array<int,3>{0,1,2};
    auto data2 = std::array<A,3>{ A(0,0),A(1,1),A(2,2) };
    auto data3 = std::vector<std::vector<int>> { {0,0},{1,1},{2,2,2} };
    auto data4 = std::array<std::vector<int>,3> { {0,2} };
  //auto data5 = std::array<std::vector<A>,3> { ??? };
}

前三个示例工作得很好。我不明白为什么第四个示例没有 compile(使用 c++17),因为它与第三个示例中的完全相同。错误是我没有得到的“初始化程序太多”。我为第五个例子尝试的一切都不起作用。甚至有可能吗?

解决方法

再使用一对大括号。

auto data4 = std::array<std::vector<int>,3> { { {0,0},{1,1,1},{2,2,2} } };

否则第一个列表 {0,0} 被认为是整个 std::array<std::vector<int>,3 > 类型对象的初始化器..

std::array 是一个聚合。来自 C++ 14 标准(23.3.2.1 类模板数组概述)

2 数组是一个聚合(8.5.1),可以用 语法

array<T,N> a = { initializer-list }; 

其中 initializer-list 是最多 N 个元素的逗号分隔列表 其类型可转换为 T。