为什么列表迭代器在SGI STL的实现中具有三个模板参数?

时间:2018-06-29 11:29:17

标签: c++ templates stl iterator

在阅读SGI STL的列表迭代器实现时遇到问题。

template<class T>
struct __list_node {
    void *prev;
    void *next;
    T data;
};

template<class T, class Ref, class Ptr>
struct __list_iterator {
    typedef __list_iterator<T, T&, T*> iterator;
    typedef __list_iterator<T, Ref, Ptr> self;
    ...
    typedef T value_type;
    typedef Ptr pointer;
    typedef Ref reference;
    typedef __list_node<T>* link_type;
    ...
    link_type node;
    ...
    reference operator*() const { return (*node).data; }
    pointer operator-> const { return &(operator*()); }
    self& operator++() { ... }
    self operator++(int) { ... }
    ...
    ...
};

那么,为什么会有三个模板参数? 如果仅class T存在怎么办?像下面这样。

template<class T>
struct __list_iterator {
    typedef __list_iterator<T> iterator;
    typedef __list_iterator<T> self;
    ...
    typedef T value_type;
    typedef T* pointer;
    typedef T& reference;
    ...
    ...
};

我想知道对于某些特定的class T是否必须使用三个参数,或者由于某些原因我无法弄清楚。 希望有人能帮助我。非常感谢!

1 个答案:

答案 0 :(得分:1)

Alexander Stepanov(STL的发明者)解释了为什么在课程Lecture 11的课程here中,在STL中引入了referencepointer成员别名使用组件进行高效编程< / em>。

简而言之,Stepanov最初认为–给定迭代器it,可以安全地假设*it的类型为value_type&&*it的类型为{ {1}}。但是,微软表示将投票反对将STL包含在标准中,除非它可以容纳多个内存模型,当时该模型包括具有微小,巨大和长指针的模型。因此,引入了value_type*reference。引用他的演讲:

  

“这不是特别有害,但是会混淆事物。语言专家当然喜欢它;它为他们提供了稳定的就业机会。”

有趣的是,即使Stepanov为满足其要求而更改了STL的整个体系结构,Microsoft仍然决定投票反对该STL。

课程的相关部分是{{3}}。