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

iwa*_*ans 21 c++ aggregate-initialization stdarray

请参阅此示例: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
}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 24

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

std::array <std::pair<int,int>, 3> a{{{1,2},{3,4},{5,6}}};
Run Code Online (Sandbox Code Playgroud)

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

  • `std::array` 是一个聚合,因此您需要 `{}` 来构造 `std::array` 类,并需要 `{}` 来构造它的成员数组。`std::vector` 有一个接受 `std::initializer_list` 的构造函数,因此构造向量的 `{}` 会自动调用它。 (6认同)
  • 那么为什么“向量”与“数组”不同呢? (2认同)

Vla*_*cow 14

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

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

std::array <std::pair<int,int>, 3> a{{1,2},{3,4},{5,6}};
                                     ^^^^^
Run Code Online (Sandbox Code Playgroud)

被视为内部聚合的初始化程序。在这种情况下,以下花括号初始化器被视为冗余初始化器。

所以你可以写

std::array <std::pair<int, int>, 3> a{ { {1,2},{3,4},{5,6} } };
                                       ^                   ^
                                       |the inner aggregate|
Run Code Online (Sandbox Code Playgroud)

或喜欢

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

  • 值得一提的是, std::array 没有初始化器列表构造函数,而向量有。 (3认同)
  • @iwans std::array 是一个聚合。它没有用户声明的构造函数。:) (2认同)