std::basic_const_iterator
<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.
iterator_category
If Iter
models forward_iterator
:
iterator_category
is the same type as std::iterator_traits <Iter>::iterator_category.
Otherwise, there is no member iterator_category
.
iterator_concept
Iter
models contiguous_iterator
;Iter
models random_access_iterator
;Iter
models bidirectional_iterator
;Iter
models forward_iterator
;value_type
std::iter_value_t <Iter>
difference_type
std::iter_difference_t <Iter>
current
(private)
the underlying iterator from which base()
copies or movesbasic_const_iterator
type If I
models constant-iterator
(an exposition-only concept), then const_iterator<I> denotes a type I
. Otherwise, basic_const_iterator<I>.
If S
models input_iterator
, then const_sentinel<S> denotes a type const_iterator<S>. Otherwise, S
.
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
|
#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 }
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 |