Я использую 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
, такие ошибки также можно предотвратить.