为什么reverse_iterator会双重定义其嵌套类型?

Tem*_*Rex 9 c++ iterator language-lawyer iterator-traits reverse-iterator

似乎迭代器适配器reverse_iterator双重定义了大多数嵌套类型.特别是,从公开继承std::iterator暴露iterator_category,value_type,difference_type,pointerreference.除了iterator_category和之外value_type,这些都typedef在类定义中再次明确地使用.

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
};
Run Code Online (Sandbox Code Playgroud)

问题:为什么重复定义?这只是为了说明的目的,还是有更多的东西?为什么不重新定义iterator_categoryvalue_type

Jer*_*fin 7

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

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

它看起来(对我来说)这或多或少是一个偶然的中途点,在(或多或少意外地)需要使用std::iterator作为基类的过程中,并且只是指定必须定义的名称std::reverse_iterator(和当然还有各种其他迭代器).

对于那些关心的人,其历史包括:

N3931
第2438期

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

N3145
N3198

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