问题描述
我想为我的向量和数组使用初始化列表。最终,我想初始化某个 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。