iota_view::size
sometimes rejects integer-class typesSection: 25.6.4.2 [range.iota.view] Status: C++23 Submitter: Jiang An Opened: 2021-09-29 Last modified: 2023-11-22
Priority: Not Prioritized
View all other issues in [range.iota.view].
View all issues with C++23 status.
Discussion:
It seems that the iota_view
tends to accept integer-class types as its value types, by using
is-integer-like
or is-signed-integer-like
through the specification,
although it's unspecified whether any of them satisfies weakly_incrementable
. However, the
requires-clause of iota_view::size
(25.6.4.2 [range.iota.view] p16) uses
(integral<W> && integral<Bound>)
, which sometimes rejects integer-class types.
(is-integer-like<W> &&
is-integer-like<Bound>)
?
[2021-10-14; Reflector poll]
Set status to Tentatively Ready after six votes in favour during reflector poll.
[2022-02-10 Approved at February 2022 virtual plenary. Status changed: Tentatively Ready → WP.]
Proposed resolution:
This wording is relative to N4892.
Modify 25.6.4.2 [range.iota.view] as indicated:
constexpr auto size() const requires see below;-15- Effects: Equivalent to:
if constexpr (is-integer-like<W> && is-integer-like<Bound>) return (value_ < 0) ? ((bound_ < 0) ? to-unsigned-like(-value_) - to-unsigned-like(-bound_) : to-unsigned-like(bound_) + to-unsigned-like(-value_)) : to-unsigned-like(bound_) - to-unsigned-like(value_); else return to-unsigned-like(bound_ - value_);-16- Remarks: The expression in the requires-clause is equivalent to:
(same_as<W, Bound> && advanceable<W>) || (integralis-integer-like<W> &&integralis-integer-like<Bound>) || sized_sentinel_for<Bound, W>