*This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++20 status.*

### 3381. `begin` and `data` must agree for `contiguous_range`

**Section:** 26.4.5 [range.refinements] **Status:** C++20
**Submitter:** Casey Carter **Opened:** 2020-01-25 **Last modified:** 2021-02-25

**Priority: **0

**View all other** issues in [range.refinements].

**View all issues with** C++20 status.

**Discussion:**

The definition of the `contiguous_range` concept in 26.4.5 [range.refinements]/2
requires that `ranges::data(r)` be valid for a `contiguous_range r`, but fails to
impose the obvious semantic requirement that `to_address(ranges::begin(r)) == ranges::data(r)`.
In other words, `data` and `begin` must agree so that `[begin(r), end(r))` and
the counted range `data(r) + [0, size(r))` (this is the new "counted range" specification
syntax per working draft issue 2932) denote
the same sequence of elements.

*[2020-02 Prioritized as IMMEDIATE Monday morning in Prague]*

**Proposed resolution:**

This wording is relative to N4849.

Modify 26.4.5 [range.refinements] as indicated:

-2- `contiguous_range` additionally requires that the `ranges::data` customization point
(26.3.13 [range.prim.data]) is usable with the range.

template<class T>
concept contiguous_range =
random_access_range<T> && contiguous_iterator<iterator_t<T>> &&
requires(T& t) {
{ ranges::data(t) } -> same_as<add_pointer_t<range_reference_t<T>>>;
};

-?- Given an expression `t` such that `decltype((t))` is `T&`, `T`
models `contiguous_range` only if `(to_address(ranges::begin(t)) == ranges::data(t))`.

-3- The `common_range` concept […]