Issue 4105: ranges::ends_with's Returns misses difference casting (original) (raw)
This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of WP status.
4105. ranges::ends_with's Returns misses difference casting
Section: 26.6.17 [alg.ends.with] Status: WP Submitter: Hewill Kang Opened: 2024-05-17 Last modified: 2024-07-08
Priority: Not Prioritized
View all issues with WP status.
Discussion:
The Returns of the ranges version of ranges::ends_with are specified asranges::equal(ranges::drop_view(ranges::ref_view(r1), N1 - N2), r2, ...) which is not quite right when N2 is an integer-class type and N1 is an integer type, because in this caseN1 - N2 will be an integer-class type which cannot be implicitly converted to the difference_type of r1 leading to the construction of drop_viewbeing ill-formed.
[2024-06-24; Reflector poll]
Set status to Tentatively Ready after five votes in favour during reflector poll.
[St. Louis 2024-06-29; Status changed: Voting → WP.]
Proposed resolution:
This wording is relative to N4981.
- Modify 26.6.17 [alg.ends.with] as indicated:
template<input_range R1, input_range R2, class Pred = ranges::equal_to, class Proj1 = identity,
class Proj2 = identity>
requires (forward_range || sized_range) &&
(forward_range || sized_range) &&
indirectly_comparable<iterator_t, iterator_t, Pred, Proj1, Proj2>
constexpr bool ranges::ends_with(R1&& r1, R2&& r2, Pred pred = {},
Proj1 proj1 = {}, Proj2 proj2 = {});-3- Let
N1beranges::distance(r1)andN2beranges::distance(r2).-4- Returns:
falseifN1 < N2, otherwiseranges::equal(ranges::drop_view(ranges::ref_view(r1), N1 - static_cast<decltype(N1)>(N2)), r2, pred, proj1, proj2)