template<indirectly_readable It>
using iter_const_reference_t =
common_reference_t<const iter_value_t<It>&&, iter_reference_t<It>>;
template<class It>
concept constant-iterator = // exposition only
input_iterator<It> && same_as<iter_const_reference_t<It>, iter_reference_t<It>>;
template<input_iterator I>
using const_iterator = see below;
template<semiregular S>
using const_sentinel = see below;
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 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);