6

第一部分 :

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中每个元素的副本。

我对移动语义还不满意,但是不能将数据il移动到vector? 我不知道std::vectorIIRC 的深度实现,但它使用普通的旧数组。

4

1 回答 1

12

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

很可能只是一对指针,或者一个指针和一个大小。C++11 标准的第 18.9/2 段甚至在(非规范)注释中提到了这一点:

类型对象initializer_list<E>提供对类型对象数组的访问const E。[注意: 一对指针或一个指针加上一个长度将是initializer_list. initializer_list用于实现 8.5.4 中指定的初始化列表。复制 aninitializer list不会复制底层元素。——尾注]

而且:

我对移动语义还不满意,但是不能将数据il移动到向量中吗?

,你不能离开 an 的元素initializer_list,因为 an的元素initializer_list应该是不可变的(参见上面引用的段落的第一句)。这也是为什么只有const-qualified 成员函数才能让您访问元素的原因。

于 2013-06-03T10:29:48.593 回答