почему эта функция возвращает link_type, но она была объявлена ​​как итератор - PullRequest
0 голосов
/ 27 июня 2018

Это функция-член, которая была объявлена ​​в list.h (GNU STL 2.9 list.h)

iterator begin() { 
return (link_type)((*node).next); }

и link_type is

template <\class T> struct __list_node

Однако итератор равен

template<\class T, class Ref, class Ptr> struct __list_iterat

Часть list.h следующие

template <class T, class Alloc = alloc>
class list {
  protected:
    typedef void*                           void_pointer;
    typedef __list_node<T>                  list_node;
    typedef simple_alloc<list_node, Alloc>  list_node_allocator;
public:      
    typedef T                   value_type;
    typedef value_type*         pointer;
    typedef value_type& r       eference;
    typedef const value_type&   const_reference;
    typedef list_node* l        ink_type;
    typedef size_t              size_type;
    typedef ptrdiff_t           difference_type;

public:
    typedef __list_iterator<T, T&, T*>             iterator;
    typedef __list_iterator<T, const T&, const T*> const_iterator;
}

И часть __list_node следующие

template<class T, class Ref, class Ptr>
struct __list_iterator {
  typedef __list_iterator<T, T&, T*>             iterator;
  typedef __list_iterator<T, const T&, const T*> const_iterator;
  typedef __list_iterator<T, Ref, Ptr>           self;

  typedef bidirectional_iterator_tag iterator_category;
  typedef T value_type;
  typedef Ptr pointer;
  typedef Ref reference;
  typedef __list_node<T>* link_type;
  typedef size_t size_type;
  typedef ptrdiff_t difference_type;
  link_type node;
}

Они вообще разного типа! ??, зачем?

1 Ответ

0 голосов
/ 27 июня 2018

__list_iterator имеет конструктор неявного преобразования __list_iterator(link_type). Он создает итератор из указателя узла: неявный return (link_type)((*node).next) эквивалентен явному return iterator((link_type)((*node).next)).

Вы смотрите очень старый GNU STL. У текущего есть явный конструктор:

explicit
_List_iterator(__detail::_List_node_base* __x) _GLIBCXX_NOEXCEPT
: _M_node(__x) { }

iterator
begin() _GLIBCXX_NOEXCEPT
{ return iterator(this->_M_impl._M_node._M_next); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...