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.

### 3610. `iota_view::size` sometimes rejects integer-class types

Section: 24.6.4.2 [range.iota.view] Status: WP Submitter: Jiang An Opened: 2021-09-29 Last modified: 2022-02-10

Priority: Not Prioritized

View other active issues in [range.iota.view].

View all other issues in [range.iota.view].

View all issues with WP 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` (24.6.4.2 [range.iota.view] p16) uses `(integral<W> && integral<Bound>)`, which sometimes rejects integer-class types.

Should we relax the restrictions by changing this part to `(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.

1. Modify 24.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>