namespace std {
  template<class I>
    concept not-a-const-iterator = see below;                   
  template<indirectly_readable I>
    using iter-const-rvalue-reference-t =                       
      common_reference_t<const iter_value_t<I>&&, iter_rvalue_reference_t<I>>;
  template<input_iterator Iterator>
  class basic_const_iterator {
    Iterator current_ = Iterator();                             
    using reference = iter_const_reference_t<Iterator>;         
    using rvalue-reference =                                    
      iter-const-rvalue-reference-t<Iterator>;
  public:
    using iterator_concept = see below;
    using iterator_category = see below;  
    using value_type = iter_value_t<Iterator>;
    using difference_type = iter_difference_t<Iterator>;
    basic_const_iterator() requires default_initializable<Iterator> = default;
    constexpr basic_const_iterator(Iterator current);
    template<convertible_to<Iterator> U>
      constexpr basic_const_iterator(basic_const_iterator<U> current);
    template<different-from<basic_const_iterator> T>
      requires convertible_to<T, Iterator>
      constexpr basic_const_iterator(T&& current);
    constexpr const Iterator& base() const & noexcept;
    constexpr Iterator base() &&;
    constexpr reference operator*() const;
    constexpr const auto* operator->() const
      requires is_lvalue_reference_v<iter_reference_t<Iterator>> &&
               same_as<remove_cvref_t<iter_reference_t<Iterator>>, value_type>;
    constexpr basic_const_iterator& operator++();
    constexpr void operator++(int);
    constexpr basic_const_iterator operator++(int) requires forward_iterator<Iterator>;
    constexpr basic_const_iterator& operator--() requires bidirectional_iterator<Iterator>;
    constexpr basic_const_iterator operator--(int) requires bidirectional_iterator<Iterator>;
    constexpr basic_const_iterator& operator+=(difference_type n)
      requires random_access_iterator<Iterator>;
    constexpr basic_const_iterator& operator-=(difference_type n)
      requires random_access_iterator<Iterator>;
    constexpr reference operator[](difference_type n) const
      requires random_access_iterator<Iterator>;
    template<sentinel_for<Iterator> S>
      constexpr bool operator==(const S& s) const;
    template<not-a-const-iterator CI>
      requires constant-iterator<CI> && convertible_to<Iterator const&, CI>
    constexpr operator CI() const &;
    template<not-a-const-iterator CI>
      requires constant-iterator<CI> && convertible_to<Iterator, CI>
    constexpr operator CI() &&;
    constexpr bool operator<(const basic_const_iterator& y) const
      requires random_access_iterator<Iterator>;
    constexpr bool operator>(const basic_const_iterator& y) const
      requires random_access_iterator<Iterator>;
    constexpr bool operator<=(const basic_const_iterator& y) const
      requires random_access_iterator<Iterator>;
    constexpr bool operator>=(const basic_const_iterator& y) const
      requires random_access_iterator<Iterator>;
    constexpr auto operator<=>(const basic_const_iterator& y) const
      requires random_access_iterator<Iterator> && three_way_comparable<Iterator>;
    template<different-from<basic_const_iterator> I>
      constexpr bool operator<(const I& y) const
        requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
    template<different-from<basic_const_iterator> I>
      constexpr bool operator>(const I& y) const
        requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
    template<different-from<basic_const_iterator> I>
      constexpr bool operator<=(const I& y) const
        requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
    template<different-from<basic_const_iterator> I>
      constexpr bool operator>=(const I& y) const
        requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
    template<different-from<basic_const_iterator> I>
      constexpr auto operator<=>(const I& y) const
        requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I> &&
                 three_way_comparable_with<Iterator, I>;
    template<not-a-const-iterator I>
      friend constexpr bool operator<(const I& x, const basic_const_iterator& y)
        requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
    template<not-a-const-iterator I>
      friend constexpr bool operator>(const I& x, const basic_const_iterator& y)
        requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
    template<not-a-const-iterator I>
      friend constexpr bool operator<=(const I& x, const basic_const_iterator& y)
        requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
    template<not-a-const-iterator I>
      friend constexpr bool operator>=(const I& x, const basic_const_iterator& y)
        requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
    friend constexpr basic_const_iterator operator+(const basic_const_iterator& i,
                                                    difference_type n)
      requires random_access_iterator<Iterator>;
    friend constexpr basic_const_iterator operator+(difference_type n,
                                                    const basic_const_iterator& i)
      requires random_access_iterator<Iterator>;
    friend constexpr basic_const_iterator operator-(const basic_const_iterator& i,
                                                    difference_type n)
      requires random_access_iterator<Iterator>;
    template<sized_sentinel_for<Iterator> S>
      constexpr difference_type operator-(const S& y) const;
    template<not-a-const-iterator S>
      requires sized_sentinel_for<S, Iterator>
      friend constexpr difference_type operator-(const S& x, const basic_const_iterator& y);
    friend constexpr rvalue-reference iter_move(const basic_const_iterator& i)
      noexcept(noexcept(static_cast<rvalue-reference>(ranges::iter_move(i.current_))))
      {
        return static_cast<rvalue-reference>(ranges::iter_move(i.current_));
      }
  };
}
 Given some type 
I,
the concept 
not-a-const-iterator is defined as 
false
if 
I is a specialization of 
basic_const_iterator and
true otherwise
.