std::initializer_list的底层结构是什么?

What is the underlying structure of std::initializer_list?

本文关键字:结构 是什么 initializer list std      更新时间:2023-10-16

第一部分:

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