C++20 brings a more powerful iterator system, one of them is to introduce iterator_concept on the basis of iterator_category.
I found that the iterator_concept and iterator_category of many iterators in C++20 are inconsistent. Take the most famous iota_view as an example:
using R = decltype(views::iota(0));
static_assert(random_access_range<R>);
using I = ranges::iterator_t<R>;
static_assert(same_as<typename I::iterator_category, input_iterator_tag>);
static_assert(same_as<typename I::iterator_concept, random_access_iterator_tag>);
Although R models random_access_range, the iterator_category of its iterator is just an input_iterator_tag, which is inconsistent with the iterator_concept.
Why does C++20 introduce iterator_concept? What is its purpose? If I implement my own iterator, how do I define iterator_concept and iterator_category correctly? Does iterator_category still have a meaning in C++20?