9

似乎迭代器适配器reverse_iterator双重定义了它的大多数嵌套类型。特别是,它公开继承std::iterator暴露的iterator_categoryvalue_typedifference_type和。除了and ,这些都在类定义中再次显式定义。pointerreferenceiterator_categoryvalue_typetypedef

24.5.1.1 类模板 reverse_iterator [reverse.iterator]

namespace std {
template <class Iterator>
class reverse_iterator : public
     iterator<typename iterator_traits<Iterator>::iterator_category,
     typename iterator_traits<Iterator>::value_type,
     typename iterator_traits<Iterator>::difference_type,
     typename iterator_traits<Iterator>::pointer,
     typename iterator_traits<Iterator>::reference> {
public:
  typedef Iterator                                            iterator_type;
  typedef typename iterator_traits<Iterator>::difference_type difference_type;
  typedef typename iterator_traits<Iterator>::reference       reference;
  typedef typename iterator_traits<Iterator>::pointer         pointer;
  // ... rest of the class
};

问题:为什么重复定义?这仅仅是为了说明,还是有更多的意义?为什么不重新定义iterator_categoryand value_type

4

2 回答 2

7

一段时间以来,他们已经不再使用std::iterator作为基类,而是只指定每个迭代器必须定义正确的类型名称。

当他们在标准中指定基类时,这会限制实现以这种方式实现类,即使唯一真正的意图是指定迭代器需要定义一些名称。特别是,您is_base_of可以确定是否std::iteratorstd::reverse_iterator. 不,没有什么是多态的,所以这样做非常愚蠢和毫无意义,但如果你这样做,当前的标准说它必须返回 true。

看起来(对我来说)这或多或少是从(或多或少意外)需要使用std::iterator作为基类的过程中的一个意外的中间点,并简单地指定必须在std::reverse_iterator(和当然还有其他各种迭代器)。

对于那些关心的人,这方面的历史包括:

N3931
问题 2438

还有关于弃用 unary_function 和 binary_function 的相关讨论论文:

N3145
N3198

提供这些的原因与std::iterator(即,只是为了在派生类中提供一些 typedef)大致相同,因此删除它们的原因与停止std::iterator用作基类相当相关。

于 2015-03-17T20:37:04.607 回答
3

这更像是一种猜测,但所有那些typedefs在类主体规范中使用的冗余声明类型reverse_iterator。例如(C++03 IS):

pointer operator->() const;
reference operator[](difference_type n) const;

由于iterator<..>是依赖基类,因此不会搜索名称pointerreference. 因此,typedef这些名称使剩余的规范更简单:

typename iterator_traits<Iterator>::pointer operator->() const;
typename iterator_traits<Iterator>::reference operator[](typename iterator_traits<Iterator>::difference_type n) const;

另一方面,value_type不会出现在类体内,因此不需要多余的typedef.

于 2015-03-17T20:47:04.213 回答