std::basic_const_iterator
|   Defined in header  <iterator>
  | 
||
|   template< std::input_iterator Iter > class basic_const_iterator;  | 
(since C++23) | |
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.
Member types
| Member type | Definition | 
 iterator_category(conditionally present)  | 
 If  
 Otherwise, there is no member   | 
 iterator_concept
 | 
  | 
 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*)  | 
Member objects
| Member name | Definition | 
 current (private)
 | 
 the underlying iterator from which base() copies or moves(exposition-only member object*)  | 
Member functions
|   constructs a new iterator adaptor  (public member function)  | |
|   accesses the underlying iterator  (public member function)  | |
|   accesses the pointed-to element  (public member function)  | |
|   accesses an element by index  (public member function)  | |
|   advances or decrements the iterator  (public member function)  | |
|   converts into any constant iterator to which an underlying iterator can be convertible  (public member function)  | |
|   compares the underlying iterators  (public member function)  | 
Non-member functions
  compares basic_const_iterator with non-basic_const_iterator (function template)  | |
|    (C++23)  | 
  advances or decrements the iterator  (function template)  | 
|    (C++23)  | 
  computes the distance between two iterator adaptors  (function template)  | 
|    (C++23)  | 
  casts the result of dereferencing the underlying iterator to its associated rvalue reference type  (function)  | 
Helper classes
  determines the common type of an iterator and an adapted basic_const_iterator type (class template specialization)  | 
Helper alias templates
|   template< std::input_iterator I > using const_iterator = /* see description */;  | 
(since C++23) | |
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.
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) | |
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
 | 
Example
#include <cassert> #include <iterator> #include <vector> int main() { std::vector v{1, 2, 3}; std::vector<int>::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 }
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 |