在构造函数的初始化列表中使用 std::initializer_list 初始化 std::数组
Initialization of std::array with std::initializer_list in constructor's initialization list
考虑以下代码段:
struct foo {
std::vector<int> v;
foo(std::initializer_list<int> L) : v{L} {}
};
上面的代码编译良好,并按预期初始化v
。现在考虑以下代码段:
struct bar {
std::array<int, 3> a;
bar(std::initializer_list<int> L) : a{L} {}
};
上面的代码段给出了一个编译错误。
错误:没有从"std::initializer_list"到"int"的可行转换
搜索网络,我发现使用std::list_initializer
初始化成员std::array
的"正确"方法是按以下方式使用reinterpret_cast
:
bar(std::initializer_list<int> L) : a(reinterpret_cast<std::array<int, 3> const&>(*(L.begin()))) {}
问:
为什么我可以在构造函数的初始化列表中使用std::initializer_list
初始化成员std::vector
,但我不能std::array
成员?
上面显示的解决方法reinterpret_cast
是使用std::initializer_list
初始化成员std::array
的正确方法吗?
std::array
(在 Boost 库中)被设计为支持 C++03 的大括号初始化语法。在 C++03 中执行此操作的唯一方法是作为 POD(普通旧数据)类型,一种没有构造函数的类型。初始值设定项列表在C++11中与std::array
一起引入,但std::array
没有从其Boost版本更改为使用初始值设定项列表。所以,这是历史性的。
顺便说一下,请注意,这里的reinterpret_cast
很危险,因为初始值设定项列表包含的项目可能少于array
。
std::array
是围绕C++数组的薄包装器,如下所示
template<typename T, size_t N>
struct {
T data[N];
}
所以它没有任何能够应对std::initializer_list
的构造函数,你必须坚持使用vector
或在构造函数中使用其他东西(如std::copy
)复制元素。
foo(std::initializer_list<int> L) : v{L} {}
std::vector
有一个接受std::initializer_list
作为输入的构造函数。 因此,您正在初始化向量本身,而不是std::vector
的任何特定元素。
bar(std::initializer_list<int> L) : a{L} {}
std::array
没有接受std::initializer_list
作为输入的构造函数(实际上,它根本没有任何构造函数,只能通过聚合初始化进行初始化)。 因此,您正在尝试初始化数组的特定元素,这就是为什么编译器抱怨它无法将std::initializer_list
转换为int
的原因。
- 初始化具有非默认构造函数的std::数组项的更好方法
- 如何在旧c++中初始化const-std向量
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector和std::valarray初始化构造函数不同
- 使用通用值初始化 std::map,不重复
- std::initializer_list,大括号初始化和标头
- 标准::unordered_map 中的 std::array 的值初始化
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 初始化 std::vector 替换为单大括号而不是双大括号
- 包含 std::list 的结构体的 C++ 初始化
- 在构造函数中使用可变参数初始化 std::tuple
- 使用 std::分配器在 constexpr 中进行默认初始化
- 使用大括号初始化 std::vector 使用初始值设定项列表
- 为什么初始化 std::vector 时不能使用模板整数?
- 使用 std::ios_base::Init 正确初始化全局变量
- 如何在构造函数参数中初始化"std::set"?
- 初始化 std::数组 of Eigen::Map
- C++ - std::构造函数中的矢量初始化
- C STD ::初始化类对象中的Alloc错误错误
- std::初始化列表中的数组初始值设定项列表初始化