第一部分:
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使用普通的数组。
答案 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
- 合格的成员函数才能让您访问元素的原因。