为什么 reverse_iterator 双重定义其嵌套类型?
Why does reverse_iterator doubly define its nested types?
似乎迭代器适配器 reverse_iterator
双重定义了它的大部分嵌套类型。特别是,它公开继承自 std::iterator
,公开了 iterator_category
、value_type
、difference_type
、pointer
和 reference
。除了 iterator_category
和 value_type
,这些都在 class 定义中再次显式 typedef
。
24.5.1.1
Class 模板 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_category
和 value_type
?
一段时间以来,他们已经不再使用 std::iterator
作为基础 class,而只是指定每个迭代器必须定义正确的类型名称。
当他们在标准中指定基础 class 时,这会限制实现以这种方式实现 class,即使唯一的真正意图是指定迭代器需要定义一些名称.特别是,您可以 is_base_of
确定 std::iterator
是否是 std::reverse_iterator
的基础 class。不,没有什么是多态的,所以这样做是非常愚蠢和毫无意义的,但是如果你这样做,当前的标准说它 must return true.
看起来(对我来说)这或多或少是从(或多或少是偶然的)需要使用 std::iterator
作为基础 class,并简单地指定必须在 std::reverse_iterator
中定义的名称(当然还有各种其他迭代器)。
对于那些关心的人,这方面的历史包括:
还有关于弃用 unary_function 和 binary_function 的相关讨论文件:
提供这些的原因与 std::iterator
大致相同(即,只是为了在派生的 class 中提供一些类型定义),因此删除它们的原因与停止使用 std::iterator
作为基础 class.
这更像是一个猜测,但所有那些冗余的 typedefs
都声明了在 reverse_iterator
的 class 主体规范中使用的类型。例如 (C++03 IS):
pointer operator->() const;
reference operator[](difference_type n) const;
由于 iterator<..>
是依赖基 class,因此不会搜索名称 pointer
和 reference
。所以 typedef
使用这些名称可以使剩余的规范更简单:
typename iterator_traits<Iterator>::pointer operator->() const;
typename iterator_traits<Iterator>::reference operator[](typename iterator_traits<Iterator>::difference_type n) const;
另一方面,value_type
没有出现在class体内,因此不需要多余的typedef
。
似乎迭代器适配器 reverse_iterator
双重定义了它的大部分嵌套类型。特别是,它公开继承自 std::iterator
,公开了 iterator_category
、value_type
、difference_type
、pointer
和 reference
。除了 iterator_category
和 value_type
,这些都在 class 定义中再次显式 typedef
。
24.5.1.1 Class 模板 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_category
和 value_type
?
一段时间以来,他们已经不再使用 std::iterator
作为基础 class,而只是指定每个迭代器必须定义正确的类型名称。
当他们在标准中指定基础 class 时,这会限制实现以这种方式实现 class,即使唯一的真正意图是指定迭代器需要定义一些名称.特别是,您可以 is_base_of
确定 std::iterator
是否是 std::reverse_iterator
的基础 class。不,没有什么是多态的,所以这样做是非常愚蠢和毫无意义的,但是如果你这样做,当前的标准说它 must return true.
看起来(对我来说)这或多或少是从(或多或少是偶然的)需要使用 std::iterator
作为基础 class,并简单地指定必须在 std::reverse_iterator
中定义的名称(当然还有各种其他迭代器)。
对于那些关心的人,这方面的历史包括:
还有关于弃用 unary_function 和 binary_function 的相关讨论文件:
提供这些的原因与 std::iterator
大致相同(即,只是为了在派生的 class 中提供一些类型定义),因此删除它们的原因与停止使用 std::iterator
作为基础 class.
这更像是一个猜测,但所有那些冗余的 typedefs
都声明了在 reverse_iterator
的 class 主体规范中使用的类型。例如 (C++03 IS):
pointer operator->() const;
reference operator[](difference_type n) const;
由于 iterator<..>
是依赖基 class,因此不会搜索名称 pointer
和 reference
。所以 typedef
使用这些名称可以使剩余的规范更简单:
typename iterator_traits<Iterator>::pointer operator->() const;
typename iterator_traits<Iterator>::reference operator[](typename iterator_traits<Iterator>::difference_type n) const;
另一方面,value_type
没有出现在class体内,因此不需要多余的typedef
。