Thecontiguous_iterator
concept refinesrandom_access_iterator
by providing a guarantee the denoted elements are stored contiguously in the memory.
Given an iteratori of a type that modelscontiguous_iterator , a sentinels and a non-negative integern: This means a program cannot rely on any side effects of dereferencing, incrementing or decrementing a contiguous iteratori, because standard library functions might operate on pointers obtained bystd::to_address(i) instead of operating oni directly. | (since C++26) |
[edit]Iterator concept determination
Definition of this concept is specified via an exposition-only alias template/*ITER_CONCEPT*/.
In order to determine/*ITER_CONCEPT*/<I>, letITER_TRAITS<I> denoteI if the specializationstd::iterator_traits<I> is generated from the primary template, orstd::iterator_traits<I> otherwise:
- IfITER_TRAITS<I>::iterator_concept is valid and names a type,/*ITER_CONCEPT*/<I> denotes the type.
- Otherwise, ifITER_TRAITS<I>::iterator_category is valid and names a type,/*ITER_CONCEPT*/<I> denotes the type.
- Otherwise, ifstd::iterator_traits<I> is generated from the primary template,/*ITER_CONCEPT*/<I> denotesstd::random_access_iterator_tag.
(That is,std::derived_from</*ITER_CONCEPT*/<I>,std::contiguous_iterator_tag> is assumed to befalse.) - Otherwise,/*ITER_CONCEPT*/<I> does not denote a type and results in a substitution failure.
[edit]Semantic requirements
Leta andb bedereferenceable iterators andc be a non-dereferenceable iterator of typeI
such thatb isreachable froma andc is reachable fromb, the typeI
modelscontiguous_iterator
only if all the concepts it subsumes are modeled and all following conditions are satisfied:
[edit]Equality preservation
Expressions declared inrequires expressions of the standard library concepts are required to beequality-preserving (except where stated otherwise).
[edit]Implicit expression variations
Arequires expression that uses an expression that is non-modifying for some constant lvalue operand also requiresimplicit expression variations.
contiguous_iterator
is modeled by every pointer type to complete object type.
Iterator types in the standard library that are required to satisfy theLegacyContiguousIterator requirements in C++17 are also required to modelcontiguous_iterator
in C++20.
[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 |
---|
LWG 3607 | C++20 | contiguous_iterator could have custom ranges::iter_move andranges::iter_swap behaviors | prohibited |
LWG 4170 | C++20 | a pair of value-initializedcontiguous_iterator s might not be able to represent an empty range | guaranteed |
[edit]See also