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

mil*_*bos 0 c++ constructor casting constants

我想用 实现构造函数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();
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用它时:

#include "vec2.hpp"

int main()
{
    Vec<int> v({ 1, 2, 3, 4 });
}
Run Code Online (Sandbox Code Playgroud)

我很惊讶std::initializer_list::begin()end()迭代器是const iterator,不可写iterator(就像其他所有容器一样,std::vector返回一个可写的迭代器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]
Run Code Online (Sandbox Code Playgroud)

所以现在我需要投射T* const begin()to 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());
}
Run Code Online (Sandbox Code Playgroud)

但后来我得到了:

free(): invalid pointer
Aborted
Run Code Online (Sandbox Code Playgroud)

所以我该怎么做?

Ser*_*eyA 6

初始化列表是短期序列的轻量级代理对象,它们不应该用于将数据写入这些结构或保留它们以备将来使用。

如果要实现自己的vector类构造函数 accept initializer list,则必须提供的数据复制initializer_list到自己的存储中。否则,您很可能最终会遇到悬空迭代器。