std::initializer_list<T>
分配一个临时数组T[]
,其元素是使用列表初始化程序从中复制的。 begin
和end
方法返回const T*
。这样一来,您就无法移动元素,并且可以执行另一个副本。但是,这样做很简单
Vector(std::initializer_list<T> IL) :Size{IL.size()}, :Storage{new T[size]} {
T* slot = Storage;
for (auto ele = IL.begin(); ele != IL.end(); ele++, slot++)
*slot = std::move(*const_cast<T*>(ele));
}
我确定std::initializer_list<T>::begin
返回const T*
的确有正当的理由,因此您不应该执行上面显示的操作,但我看不到。
答案 0 :(得分:4)
初始化列表不仅返回T const*
。支持它的数组也被声明为const。
[dcl.init.list]
5构造了类型为
std::initializer_list<E>
的对象 从初始化程序列表中,就好像实现已生成并 实现类型为“N
constE
的数组的prvalue,其中N
是 初始化程序列表中的元素数。
这意味着您的琐碎示例可能会尝试修改声明为常量的对象。这导致未定义的行为。为了避免UB,我们不应该这样做。