C++ array初始化需要双层大括号

对于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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值