C++ 将初始值设定项\u列表分配给std::array
我正在尝试将初始值设定项\u列表分配给std::array,如下所示:C++ 将初始值设定项\u列表分配给std::array,c++,c++11,stl,C++,C++11,Stl,我正在尝试将初始值设定项\u列表分配给std::array,如下所示: std::array<int,2> arr = {0,1}; arr = {0,1,2}; std::array arr={0,1}; arr={0,1,2}; 我立刻得到一个错误,说操作员没有可行的过载= 我知道我不能尝试分配一个大小大于数组大小的初始值设定项列表,但我只是想了解std::array是如何做到这一点的 我试着在查看代码,但在那里没有看到重载运算符。那么std::array如何使用默认运算符=
std::array<int,2> arr = {0,1};
arr = {0,1,2};
std::array arr={0,1};
arr={0,1,2};
我立刻得到一个错误,说操作员没有可行的过载=
我知道我不能尝试分配一个大小大于数组大小的初始值设定项列表,但我只是想了解std::array是如何做到这一点的
我试着在查看代码,但在那里没有看到重载运算符。那么std::array如何使用默认运算符=将此类尝试标记为编译器错误呢。默认运算符=如何知道检查初始值设定项列表的大小?请帮助我理解这一点。如果您仔细阅读您提供的代码链接,您将在第112行的注释中看到这一点- //聚合类型没有显式构造/复制/销毁 数组是一种聚合类型,可以像常规数组一样使用带括号的初始值设定项列表来初始化它(其元素是单独的) 代码在第109行和第110行
typedef _GLIBCXX_STD_C::__array_traits<_Tp, _Nm> _AT_Type;
typename _AT_Type::_Type _M_elems;
typedef\u GLIBCXX\u STD\u C::\u数组\u traits\u AT\u Type;
typename _AT_Type::_Type _M_elems;
在堆栈上定义大小为2的常规数组
因此,当您将带括号的初始值设定项列表分配给arr时,初始值设定项列表用于创建一个临时std::array
,然后使用默认的赋值运算符将其复制到数组中。只有当初始值设定项列表的大小小于或等于2时,此操作才会成功。当传递大小大于2的大括号初始值设定项列表时,它会被标记为错误,因为无法从大小大于2的大括号列表构造std::array