gpt4 book ai didi

c++ - 为什么 reverse_iterator 双重定义其嵌套类型?

转载 作者:可可西里 更新时间:2023-11-01 16:36:50 28 4
gpt4 key购买 nike

似乎迭代器适配器 reverse_iterator 双重定义了它的大部分嵌套类型。特别是,它公开继承自 std::iterator,它公开了 iterator_categoryvalue_typedifference_type指针引用。除了 iterator_categoryvalue_type 外,这些都在类定义中再次显式typedef

24.5.1.1类模板 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_categoryvalue_type

最佳答案

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

当他们在标准中指定基类时,这会限制实现以这种方式实现类,即使唯一的真正意图是指定迭代器需要定义一些名称。特别是,您可以通过 is_base_of 来确定 std::iterator 是否是 std::reverse_iterator 的基类。不,没有任何多态性,所以这样做很愚蠢且毫无意义,但如果您这样做,当前标准规定它必须返回 true。

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

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

N3931
Issue 2438

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

N3145
N3198

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

关于c++ - 为什么 reverse_iterator 双重定义其嵌套类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29108958/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com