如何在 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
到你自己的存储中。否则你很可能会得到 悬空 迭代器。
我想用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
到你自己的存储中。否则你很可能会得到 悬空 迭代器。