2.5 KiB
[iterator.concept.contiguous]
24 Iterators library [iterators]
24.3 Iterator requirements [iterator.requirements]
24.3.4 Iterator concepts [iterator.concepts]
24.3.4.14 Concept contiguous_iterator [iterator.concept.contiguous]
The contiguous_iterator concept provides a guarantee that the denoted elements are stored contiguously in memory.
templateconcept contiguous_iterator =random_access_iterator &&derived_from<ITER_CONCEPT(I), contiguous_iterator_tag> && is_lvalue_reference_v<iter_reference_t> &&same_as<iter_value_t, remove_cvref_t<iter_reference_t>> &&requires(const I& i) {{ to_address(i) } -> same_as<add_pointer_t<iter_reference_t>>; };
Let a and b be dereferenceable iterators andc be a non-dereferenceable iterator of type I such that b is reachable from a andc is reachable from b, and let D be iter_difference_t.
The type I models contiguous_iterator only if
to_address(a) == addressof(*a),
to_address(b) == to_address(a) + D(b - a),
to_address(c) == to_address(a) + D(c - a),
to_address(I{}) is well-defined,
ranges::iter_move(a) has the same type, value category, and effects as std::move(*a), and
if ranges::iter_swap(a, b) is well-formed, it has effects equivalent to ranges::swap(*a, *b).