对于存储迭代器,iterator_category应该是什么?

Ser*_*sta 7 c++ iterator

语境:

我正在尝试构建一个容器,它将作为运行时定义维度的多维数组的包装器 - 实际上底层数组当然是总大小的一维数组.主要部分是operator []返回子数组的包装器.

由于容器需要迭代器,我目前实施该容器迭代器,无论是Container::iteratorContainer::const_iterator.我努力模仿标准容器迭代器,我的实现几乎满足随机访问迭代器的所有要求,除了:

前向迭代器[forward.iterators]

...
6如果ab都是可解除引用的,那么a == b当且仅当*a*b并且绑定到同一个对象时.

不尊重它的原因是operator *必须返回对子容器的引用.所以我的实现是一个存储迭代器,它包含一个随迭代器移动的子容器成员,并operator *返回对该成员对象的引用

简化实施:

template <class T>
class SubArray {
    T *arr;
    size_t *sizes;
    size rowsize;
public:
    ...
    Iterator<T> begin() {
        return Iterator<T>(operator[](0));
    }
    ...
};

class Iterator<T> {
   SubArray elt;
public:
    Iterator(const SubArray<T>& pos): elt(pos) {}
    ...
    SubArray<T>& operator *() {
        return elt;
    ...
};
Run Code Online (Sandbox Code Playgroud)

根据cppreference(以及不同实现的源代码)std::filesystem::path::iterator也是一个存储迭代器.

iterator_category迭代器的成员应该帮助其他类从输入迭代器到随机访问来识别迭代器的类型.什么应该是iterator_category我的存储迭代器,它满足几乎所有的随机访问迭代器的要求,但失败了一点前进迭代器?注意:这足以使其std::reverse_iterator无法使用.

备注:

我可以确认std::filesystem::path::iterator包含Clang实现:

typedef bidirectional_iterator_tag iterator_category;
Run Code Online (Sandbox Code Playgroud)

但也是一个防止std::reverve_iterator尝试使用它的标记

参考文献:

  • Code Review上我的容器类的完整源代码
  • 关于std::reverse_iteratorSO上存放容器的问题
  • std::reverse_iterator关于cppreference(参见示例代码上面的注释)