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

时间:2013-06-03 10:21:01

标签: c++ c++11 stl initializer-list

第一部分:

std::initializer_list是C ++ 11的一个非常有用的功能,所以我想知道它是如何在标准库中实现的。从我读的here开始,编译器创建了一个类型为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::vector的深度实现,但IIRC使用普通的数组。

1 个答案:

答案 0 :(得分:12)

  

std::initializer_list的基本结构是什么?

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

  

类型为initializer_list<E>的对象提供对const E类型对象数组的访问。 [ 注意:   一对指针或指针加上长度将是initializer_list 的明显表示。   initializer_list用于实现8.5.4中指定的初始化列表。正在复制initializer list   不要复制底层元素。 - 后注]

此外:

  

我对移动语义感到不满意,但是il的数据无法移动到向量中吗?

,您无法移动initializer_list的元素,因为initializer_list的元素应该是不可变的(请参阅段落的第一句话)引用上面)。这也是为什么只有const - 合格的成员函数才能让您访问元素的原因。