对于array 的初始化我们可以使用列表初始化:
array<int, 8> test = {
1,
2,
3,
4,
5,
6,
7,
8
};
但是当我们不再使用简单的内置类型array 时:
array<pair<int, int>, 8> dirs = {
{-1, -1},
{-1, 0},
{-1, 1},
{0, -1},
{0, 1},
{1, -1},
{1, 0},
{1, 1},
};
编译器就会报错:No viable conversion from 'int' to 'std::pair<int, int>' 但是如果使用双层大括号,就像这样:
array<pair<int, int>, 8> dirs = {{
{-1, -1},
{-1, 0},
{-1, 1},
{0, -1},
{0, 1},
{1, -1},
{1, 0},
{1, 1},
}};
编译器就不会报错,是不是很神奇。 经过在网上查阅资料,看到stackoverflow 上一个人解释说,array 的原型是结构体中的数组:
template<typename T, int size>
struct std::array
{
T a[size];
};
因此,产生了需要双大括号的问题:最外面的大括号是给结构体初始化用的,里面的大括号是给数组初始化用的。 但是标准中并没有提到这一点,因此这个可能是编译器的bug
|