std::basic_const_iterator - cppreference.com (original) (raw)

std::basic_const_iterator

std::basic_const_iterator is an iterator adaptor which behaves exactly like the underlying iterator (which must be at least an LegacyInputIterator or model input_iterator), except that dereferencing converts the value returned by the underlying iterator as immutable. Specializations of std::basic_const_iterator are constant iterators, that is, the iterator can never be used as an output iterator because modifying elements is not allowed.

Contents

[edit] Member types

Member type Definition
iterator_category(conditionally present) If Iter models forward_iterator: member iterator_category is the same type as std::iterator_traits<Iter>::iterator_category. Otherwise, there is no member iterator_category.
iterator_concept std::contiguous_iterator_tag, if Iter models contiguous_iterator; std::random_access_iterator_tag, if Iter models random_access_iterator; std::bidirectional_iterator_tag, if Iter models bidirectional_iterator; std::forward_iterator_tag, if Iter models forward_iterator; std::input_iterator_tag otherwise.
value_type std::iter_value_t<Iter>
difference_type std::iter_difference_t<Iter>
reference (private) std::iter_const_reference_t<Iter>(exposition-only member type*)

[edit] Member objects

Member name Definition
current (private) the underlying iterator from which base() copies or moves(exposition-only member object*)

[edit] Member functions

(constructor) constructs a new basic_const_iterator (public member function) [edit]
base accesses the underlying iterator (public member function) [edit]
operator*operator-> accesses the pointed-to element (public member function) [edit]
operator[] accesses an element by index (public member function) [edit]
operator++operator++(int)operator+=operator--operator--(int)operator-= advances or decrements the iterator (public member function) [edit]
operator constant-iterator converts into any constant iterator to which an underlying iterator can be convertible (public member function) [edit]
operator==operatoroperator<=operator>=operator<=> compares the underlying iterators (public member function) [edit]

[edit] Non-member functions

[edit] Helper classes

[edit] Helper alias templates

If I models constant-iterator (an exposition-only concept), then const_iterator<I> denotes a type I. Otherwise, basic_const_iterator<I>.

| template< std::semiregular S > using const_sentinel = /* see description */; | | (since C++23) | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | ------------- |

If S models input_iterator, then const_sentinel<S> denotes a type const_iterator<S>. Otherwise, S.

[edit] Helper function templates

| template< std::input_iterator T > constexpr const_iterator<T> make_const_iterator( I it ) { return it; } | | (since C++23) | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ------------- | | template< std::semiregular S > constexpr const_sentinel<S> make_const_sentinel( S s ) { return s; } | | (since C++23) |

[edit] Notes

Feature-test macro Value Std Feature
__cpp_lib_ranges_as_const 202207L (C++23) std::basic_const_iterator
202311L (C++23)(DR) std::basic_const_iterator should follow its underlying type's convertibility

[edit] Example

#include #include #include   int main() { std::vector v{1, 2, 3}; std::vector::iterator i = v.begin(); *i = 4; // OK, v[0] == 4 now i[1] = 4; // OK, the same as *(i + 1) = 4;   auto ci = std::make_const_iterator(i); assert(*ci == 4); // OK, can read the underlying object assert(ci[0] == 4); // OK, ditto // *ci = 13; // Error: location is read-only // ci[0] = 13; // Error: ditto ci.base()[0] = 42; // OK, underlying iterator is writable assert(*ci == 42); // OK, underlying location v[0] was modified }

[edit] Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
P2836R1 C++23 basic_const_iterator doesn't follow its underlying type's convertibility conversion operator provided