你为什么不应该std :: move(* const_cast <T *>(ele))`std :: initializer_list`的元素呢?

时间:2019-12-06 07:02:05

标签: c++

std::initializer_list<T>分配一个临时数组T[],其元素是使用列表初始化程序从中复制的。 beginend方法返回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*的确有正当的理由,因此您不应该执行上面显示的操作,但我看不到。

1 个答案:

答案 0 :(得分:4)

初始化列表不仅返回T const*。支持它的数组也被声明为const。

  

[dcl.init.list]

     

5构造了类型为std​::​initializer_­list<E>的对象   从初始化程序列表中,就好像实现已生成并   实现类型为“ N const E的数组的prvalue,其中N是   初始化程序列表中的元素数。

这意味着您的琐碎示例可能会尝试修改声明为常量的对象。这导致未定义的行为。为了避免UB,我们不应该这样做。