为什么 std::array<std::pair<int,int>, 3> 不能使用嵌套初始化列表进行初始化,但 std::vector<std::pair<int,int>> 可以?

Why can't std::array<std::pair<int,int>, 3> be initialized using nested initializer lists, but std::vector<std::pair<int,int>> can?

看这个例子:https://godbolt.org/z/5PqYWP

为什么不能像对向量一样初始化这个对数组?

#include <vector>
#include <array>

int main()
{
    std::vector<std::pair<int,int>>    v{{1,2},{3,4},{5,6}}; // succeeds 
    std::array <std::pair<int,int>, 3> a{{1,2},{3,4},{5,6}}; // fails to compile
}

您需要添加一对外括号来初始化 std::array<...> 对象本身:

std::array <std::pair<int,int>, 3> a{{{1,2},{3,4},{5,6}}};

最外面的一对是数组对象,第二对是对象内部的聚合数组。然后是数组中的元素列表。

class 模板的特化 std::array 表示包含另一个聚合的聚合。

错误的原因是这个声明中的第一个花括号初始化器

std::array <std::pair<int,int>, 3> a{{1,2},{3,4},{5,6}};
                                     ^^^^^

被认为是内部聚合的初始值设定项。在这种情况下,以下大括号初始化器被视为冗余初始化器。

所以你可以这样写

std::array <std::pair<int, int>, 3> a{ { {1,2},{3,4},{5,6} } };
                                       ^                   ^
                                       |the inner aggregate|

或喜欢

std::array <std::pair<int, int>, 3> a{ std::make_pair( 1, 2 ), std::make_pair( 3, 4 ), std::make_pair( 5, 6 ) };