Files
2025-10-25 03:02:53 +03:00

14 KiB

[const.iterators.iterator]

24 Iterators library [iterators]

24.5 Iterator adaptors [predef.iterators]

24.5.3 Constant iterators and sentinels [const.iterators]

24.5.3.3 Class template basic_const_iterator [const.iterators.iterator]

namespace std {templateconcept not-a-const-iterator = see below; // exposition onlytemplate<indirectly_readable I>using iter-const-rvalue-reference-t = // exposition only common_reference_t<const iter_value_t&&, iter_rvalue_reference_t>; template<input_iterator Iterator>class basic_const_iterator { Iterator current_ = Iterator(); // exposition onlyusing reference = iter_const_reference_t; // exposition onlyusing rvalue-reference = // exposition only**iter-const-rvalue-reference-t; public:using iterator_concept = see below; using iterator_category = see below; // not always presentusing value_type = iter_value_t; using difference_type = iter_difference_t;

basic_const_iterator() requires default_initializable = default; constexpr basic_const_iterator(Iterator current); template<convertible_to U>constexpr basic_const_iterator(basic_const_iterator 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->() constrequires is_lvalue_reference_v<iter_reference_t> &&same_as<remove_cvref_t<iter_reference_t>, value_type>; constexpr basic_const_iterator& operator++(); constexpr void operator++(int); constexpr basic_const_iterator operator++(int) requires forward_iterator; constexpr basic_const_iterator& operator--() requires bidirectional_iterator; constexpr basic_const_iterator operator--(int) requires bidirectional_iterator; constexpr basic_const_iterator& operator+=(difference_type n)requires random_access_iterator; constexpr basic_const_iterator& operator-=(difference_type n)requires random_access_iterator; constexpr reference operator[](difference_type n) constrequires random_access_iterator; template<sentinel_for S>constexpr bool operator==(const S& s) const; template<not-a-const-iterator CI>requires constant-iterator && convertible_to<Iterator const&, CI>constexpr operator CI() const &; template<not-a-const-iterator CI>requires constant-iterator && convertible_to<Iterator, CI>constexpr operator CI() &&; constexpr bool operator<(const basic_const_iterator& y) constrequires random_access_iterator; constexpr bool operator>(const basic_const_iterator& y) constrequires random_access_iterator; constexpr bool operator<=(const basic_const_iterator& y) constrequires random_access_iterator; constexpr bool operator>=(const basic_const_iterator& y) constrequires random_access_iterator; constexpr auto operator<=>(const basic_const_iterator& y) constrequires random_access_iterator && three_way_comparable; template<different-from<basic_const_iterator> I>constexpr bool operator<(const I& y) constrequires random_access_iterator && totally_ordered_with<Iterator, I>; template<different-from<basic_const_iterator> I>constexpr bool operator>(const I& y) constrequires random_access_iterator && totally_ordered_with<Iterator, I>; template<different-from<basic_const_iterator> I>constexpr bool operator<=(const I& y) constrequires random_access_iterator && totally_ordered_with<Iterator, I>; template<different-from<basic_const_iterator> I>constexpr bool operator>=(const I& y) constrequires random_access_iterator && totally_ordered_with<Iterator, I>; template<different-from<basic_const_iterator> I>constexpr auto operator<=>(const I& y) constrequires random_access_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 && 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 && 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 && 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 && totally_ordered_with<Iterator, I>; friend constexpr basic_const_iterator operator+(const basic_const_iterator& i, difference_type n)requires random_access_iterator; friend constexpr basic_const_iterator operator+(difference_type n, const basic_const_iterator& i)requires random_access_iterator; friend constexpr basic_const_iterator operator-(const basic_const_iterator& i, difference_type n)requires random_access_iterator; template<sized_sentinel_for 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_)); }};}

1

#

Given some type I, the concept not-a-const-iterator is defined as false if I is a specialization of basic_const_iterator andtrue otherwise.