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)
所以我该怎么做?
初始化列表是短期序列的轻量级代理对象,它们不应该用于将数据写入这些结构或保留它们以备将来使用。
如果要实现自己的vector类构造函数 accept initializer list,则必须将提供的数据复制initializer_list到自己的存储中。否则,您很可能最终会遇到悬空迭代器。
| 归档时间: |
|
| 查看次数: |
54 次 |
| 最近记录: |