如何在 C++ 中将 const 指针转换为非常量指针?

How to cast const pointer to non-const pointer in c++?

我想用std::initializer_list实现构造函数,我试过:

#include <initializer_list>

template <class T>
class Vec
{
public:
    typedef T *iterator;
    typedef T *const const_iterator;
    typedef T value_type;
    Vec(std::initializer_list<T> init)
    {
        create(init);
    } 
    ...
private:
    iterator data;
    iterator avail;
    iterator limit;
    void create(std::initializer_list<T> init);
    ...
}

template<class T> void Vec<T>::create(std::initializer_list<T> init)
{
    data = init.begin();
    limit = avail = init.end();
}

但是当我尝试使用它时:

#include "vec2.hpp"

int main()
{
    Vec<int> v({ 1, 2, 3, 4 });
}

令我惊讶的是 std::initializer_list::begin()end() 迭代器是 const iterator,不可写 iterator(与所有其他容器一样,std::vector returns 是 begin() 上的可写迭代器,std::string 也是如此)。所以我得到一个错误:

data = init.begin();
vec2.hpp:138:19: error: invalid conversion from ‘std::initializer_list<int>::const_iterator’ {aka ‘const int*’} to ‘Vec<int>::iterator’ {aka ‘int*’} [-fpermissive]

所以现在我需要将 T* const begin() 转换为 T* begin(),但不知道如何转换。我试过

template<class T> void Vec<T>::create(std::initializer_list<T> init)
{
    data = const_cast<T*>(init.begin());
    limit = avail = const_cast<T*>(init.end());
}

但后来我得到了:

free(): invalid pointer
Aborted

那我该怎么办?

初始化器列表是 light-weighted 序列的 short-lived 代理对象,它们不应该用于将数据写入这些结构或保留它们以供将来使用。

如果您想实现自己的 vector class 接受 initializer list 的构造函数,您必须 从提供的 复制数据 initializer_list 到你自己的存储中。否则你很可能会得到 悬空 迭代器。