将一个initializer_list分配给std :: array

时间:2018-12-05 09:26:07

标签: c++ c++11 stl

我正在尝试为std :: array分配一个initializer_list,如下所示:

std::array<int,2> arr = {0,1};
arr = {0,1,2};

我立即收到一条错误消息,指出运算符=没有可行的重载。

我知道我无法尝试分配大小大于数组大小的初始化列表,但我只是想了解std :: array如何做到这一点。

我尝试浏览https://code.woboq.org/gcc/libstdc++-v3/include/std/array.html处的代码,但没有看到重载的运算符=。那么std :: array如何使用默认的operator =将此类尝试标记为编译器错误。默认操作员如何知道如何检查initializer_list的大小?请帮助我理解这一点。

1 个答案:

答案 0 :(得分:3)

如果您仔细阅读了提供的代码链接,您会在第112行的注释中看到此内容-

  

//没有针对聚合类型的显式构造/复制/破坏。

std :: array是一个聚合类型(可以单独使用各个元素),可以像常规数组一样使用支撑初始化列表进行初始化。

代码@第109、110行

typedef _GLIBCXX_STD_C::__array_traits<_Tp, _Nm> _AT_Type;
typename _AT_Type::_Type                         _M_elems;

在堆栈上定义大小为_Nm的常规数组,在您的情况下为2。

因此,当您将括号内的初始化程序列表分配给arr时,初始化程序列表将用于创建临时std::array<int,2>,然后使用默认的赋值运算符将其复制到您的数组中。仅当初始化列表的大小小于或等于2时,此操作才会成功。当您传递大小大于2的带括号的初始化列表时,由于无法构造{{ 1}}来自大小大于2的括号列表。