gpt4 book ai didi

c++ - 为什么不 `std::move(*const_cast(ele))`元素 `std::initializer_list`呢?

转载 作者:行者123 更新时间:2023-12-01 14:40:14 25 4
gpt4 key购买 nike

std::initializer_list<T>分配一个临时数组T[],其元素是使用list-initializer复制的。它是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*的确有正当的理由,因此您不应该执行上面显示的操作,但我看不到。

最佳答案

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

[dcl.init.list]

5 An object of type std​::​initializer_­list<E> is constructed from an initializer list as if the implementation generated and materialized a prvalue of type “array of N const E”, where N is the number of elements in the initializer list.



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

关于c++ - 为什么不 `std::move(*const_cast<T*>(ele))`元素 `std::initializer_list`呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59208371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com