第一部分:
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
限定的成员函数允许您访问元素的原因。