我正在尝试为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的大小?请帮助我理解这一点。
答案 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的括号列表。