subrange
should always model Range
Section: 25.5.4.2 [range.subrange.ctor] Status: C++20 Submitter: Casey Carter Opened: 2018-12-21 Last modified: 2021-02-25
Priority: 0
View all issues with C++20 status.
Discussion:
The constructors of subrange
place no requirements on the iterator and
sentinel values from which a subrange
is constructed. They allow
constructions like subrange{myvec.end(), myvec.begin()}
in which the
resulting subrange
isn't in the domain of the Range
concept
which requires that "[ranges::begin(r), ranges::end(r))
denotes a
range" ([range.range]/3.1).
We should forbid the construction of abominable values like this to enforce the
useful semantic that values of subrange
are always in the domain of
Range
.
(From ericniebler/stl2#597.)
[2019-01-20 Reflector prioritization]
Set Priority to 0 and status to Tentatively Ready
Proposed resolution:
This wording is relative to N4791.
Change 25.5.4.2 [range.subrange.ctor] as indicated:
constexpr subrange(I i, S s) requires (!StoreSize);-?- Expects:
[i, s)
is a valid range.-1- Effects: Initializes
begin_
withi
andend_
withs
.constexpr subrange(I i, S s, iter_difference_t<I> n) requires (K == subrange_kind::sized);-2- Expects:
[i, s)
is a valid range, andn == ranges::distance(i, s)
.