Ответ 1
Обоснование дано в N4284, который является принятой версией непрерывного предложения итераторов:
В этой статье термин "непрерывный итератор" вводится как уточнение итератора произвольного доступа без введения соответствующего
contiguous_iterator_tag
, который, как было установлено, нарушает код во время обсуждений в Issaquah статьи Невина Либера N3884 "Непрерывные итераторы: уточнение итераторов произвольного доступа",
Некоторый код был взломан, поскольку предполагал, что std::random_access_iterator
не может быть уточнен, и имел явные проверки на это. По сути, он сломал плохой код, который не полагался на полиморфизм для проверки категорий итераторов, но тем не менее он нарушил код, поэтому contiguous_iterator_tag
был удален из предложения.
Кроме того, возникла дополнительная проблема с классами std::reverse_iterator
-like: обратный непрерывный итератор не может быть непрерывным итератором, но обычным итератором с произвольным доступом. Эту проблему можно было бы решить для std::reverse_iterator
, но больше пользовательских оболочек итераторов, которые дополняют итератор при копировании его категории итераторов, либо лгали, либо перестали работать правильно (например, адаптеры Boost для итераторов).
Так как мой оригинальный ответ выше, std::contiguous_iterator_tag
был возвращен в TS диапазона и будет присутствовать в С++ 20. Это позволяет избежать проблем, упомянутых выше, не предоставляя их через std::iterator_traits<T>::iterator_category
но используя std::iterator_traits<T>::iterator_concept
чтобы не нарушать любой существующий код.
Понятия ContiguousIterator
и ContiguousRange
. В настоящее время они в основном отличаются от своего аналога RandomAccess
тем, что проверяют iterator_concept
чтобы узнать, является ли он произвольным доступом или смежным итератором. Однако в другом предложении, Helpful pointers для ContiguousIterator
также предлагается, чтобы смежные итераторы реализовали функцию to_address
которая возвращает базовый указатель. Я не знаю, находится ли это предложение на рассмотрении, чтобы быть принятым или нет.