gpt4 book ai didi

c++ - 将 initializer_list 分配给 std::array

转载 作者:行者123 更新时间:2023-11-30 02:17:23 24 4
gpt4 key购买 nike

我正在尝试将 initializer_list 分配给 std::array,如下所示:

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

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

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

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

最佳答案

如果您仔细阅读您提供的代码链接,您会在第 112 行的评论中看到这一点 -

// No explicit construct/copy/destroy for aggregate type.

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 的花括号初始化列表时,它会被标记为错误,因为无法从中构造 std::array<int,2>大小大于 2 的花括号列表。

关于c++ - 将 initializer_list 分配给 std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53628981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com