C ++ 20 представляет правильные концепции для различных типов итераторов в стандартной библиотеке (ввод, вывод, пересылка, двунаправленный, произвольный доступ, ...).
Хотя исходные именованные требования для них В типах теги итератора из std::iterator_traits
вообще не упоминаются, новые концепции C ++ 20 явно требуют их. См., Например, концепцию input_iterator
( [iterator.concept.input] ):
template<class I>
concept input_iterator =
input_or_output_iterator<I> &&
indirectly_readable<I> &&
requires { typename ITER_CONCEPT(I); } &&
derived_from<ITER_CONCEPT(I), input_iterator_tag>;
Обратите внимание на проверку тега итератора в последней строке. Все концепции итератора проверяют соответствующий тег, например, , за исключением итератора вывода . Итератор вывода всегда был особенным в этом отношении, с первых дней существования Ranges TS :
В отличие от требований итератора вывода в стандарте C ++, OutputIterator в Ranges TS выполняет не требует определения тега категории итератора.
В чем причина такой особой обработки итераторов вывода?