【发布时间】:2015-05-20 11:08:14
【问题描述】:
似乎迭代器适配器reverse_iterator 双重定义了它的大部分嵌套类型。特别是,它公开继承自std::iterator,它公开了iterator_category、value_type、difference_type、pointer 和reference。除了iterator_category 和value_type,这些都在类定义中再次显式typedef'ed。
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_category 和value_type?
【问题讨论】:
-
它也没有重新定义
value_type。无论如何,这个问题很快就会变得没有意义,感谢LWG 2438。 -
@T.C.感谢您挖掘该博士。我更新了 Q。如果你把它作为答案,我会接受。
-
也许它与依赖名称查找有关?从
iterator继承的名称并非在所有情况下都可见,因为它是一个依赖基类。 -
@dyp 可能。我也从我的模板库中提取我使用的类型。
-
这可能归结为 dependent-name 的基础,这进一步意味着在编写 @ 的定义时,编写
pointer比编写typename iterator_traits<Iterator>::pointer更容易987654339@.
标签: c++ iterator language-lawyer reverse-iterator iterator-traits