为什么 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 ) };
看这个例子: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 ) };