std::initializer_list的底层结构是什么?
What is the underlying structure of std::initializer_list?
第一部分:
std::initializer_list
是c++ 11中一个非常有用的特性,所以我想知道它是如何在标准库中实现的。从我在这里读到的,编译器创建了一个类型为T
的数组,并给出了指向initializer_list<T>
的指针。
它还指出复制initializer_list
将创建一个引用相同数据的新对象:为什么会这样?我猜它要么:
- 复制新
initializer_list
的数据 - 将数据的所有权转移到新的
initializer_list
第二部分:
来自std::vector
构造函数的众多在线参考之一:
vector (initializer_list<value_type> il,
const allocator_type& alloc = allocator_type());
(6)初始化列表构造函数
用和中每个元素的副本以相同的顺序构造一个容器。
我对移动语义还不舒服,但是il
的数据不能移动到vector
吗?我不知道std::vector
的深度实现,但IIRC使用普通的旧数组。
std::initializer_list
的底层结构是什么?
很可能只是一对指针,或者一个指针和一个大小。c++ 11标准的第18.9/2段甚至在一个(非规范的)注释中提到了这一点:
此外:类型为
initializer_list<E>
的对象提供了对类型为const E
的对象数组的访问。【注:一对指针或一个指针加一个长度是initializer_list
的明显表示。initializer_list
用于实现8.5.4中指定的初始化列表。复制initializer list
可以而不是复制底层元素。-end note]
我对移动语义还不太满意,但是
il
的数据不能移动到向量上吗?
不,您不能从initializer_list
的元素中移动,因为initializer_list
的元素应该是不可变的(参见上面引用的段落的第一句话)。这也是为什么只有const
限定的成员函数允许您访问元素的原因。
- 这里的以下 OOP 结构是什么?
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 对于可重定位的多平台安装,理想的 cmake 安装目录结构是什么?
- 表示图像矩阵的理想数据结构是什么?
- 将在 C++ 中输出多维数组内容的 for 循环的结构是什么
- 存储大量会话的最有效数据结构是什么?
- STD :: MAP的基础结构是什么
- 这个结构是什么:"void dot::print(void){"?
- 给定 C# 代码的正确数据结构是什么
- 可用于存储和管理整数集合的最佳C++数据结构是什么
- 存储将经常更新的大数组的正确结构是什么
- 使用 Qt 的简单线程 gui 应用程序的结构是什么?
- 通常用于将输入映射到显示器的数据结构是什么
- A*开放集的最佳数据结构是什么
- C++中的地图数据结构是什么
- 我的火狐扩展程序不起作用。使用C++XPCOM组件的Firefox扩展(XPI文件)的结构是什么?
- 可以处理随机访问和键搜索的数据结构是什么?
- C++ STL 堆栈中使用的基本数据结构是什么?
- (EDIT:MFC)CString类的对象的内部结构是什么
- 初始化为C++的结构是什么