Почему * _iterator все еще требует typedef что-то void после удаления std :: iterator? - PullRequest
0 голосов
/ 07 ноября 2018

Я использую ostreambuf_iterator , как показано ниже:

До с ++ 17,

template< class CharT, class Traits = std::char_traits<CharT> >
class ostreambuf_iterator : public std::iterator<std::output_iterator_tag,
                                                 void, void, void, void>

требует, чтобы мы определили каждый тип параметра std :: iterator, поэтому для std::ostreambuf_iterator, void не так уж и плох.

Как мы знаем, std :: iterator устарел в c ++ 17. Таким образом, итераторы должны вводить определения типов своих членов внутри собственного тела, например:

Member type           Definition
---------------------------------------------
value_type                  void
difference_type          void
pointer                        void
reference                     void
iterator_category       std::output_iterator_tag

Вопрос:

Почему эти пустые типы все еще должны быть определенными по типу? IOW, я думаю

Member type           Definition
---------------------------------------------
iterator_category       std::output_iterator_tag

достаточно. В конце концов, мотивация для отказа от std::iterator заключается просто в упрощении стандарта (библиотеки). Поэтому должны быть некоторые причины, которые я не могу понять.

После поиска в Google я нашел вопрос о переполнении стека, и ответ сказал:

С другой стороны, определение его как пустоты может предотвратить такие ошибки, как:

typename Iter::value_type v = *it; //useless with an output iterator if it compiled

Но я думаю, что если мы не введем defdef value_type, такие ошибки также можно предотвратить.

1 Ответ

0 голосов
/ 07 ноября 2018

Поскольку для ISO C ++ 17 std::iteartor_traits требуются все 5 типов этих элементов в целом, даже если он уже дружествен к SFINAE начиная с C ++ 17. Если вложенных типов недостаточно, экземпляр std::iterator_traits не будет иметь желаемых членов. В настоящее время это не изменилось в текущем проекте .

См. Также iterator_traits SFINAE содружественность для обоснования первоначального предложения.

...