3740. slide_view::size should preserve the signedness of underlying range's size

Section: 25.7.30.2 [range.slide.view] Status: NAD Submitter: Hewill Kang Opened: 2022-07-15 Last modified: 2022-11-30

Priority: Not Prioritized

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

View all issues with NAD status.

Discussion:

Currently, slide_view::size const has the following Effects:

auto sz = ranges::distance(base_) - n_ + 1;
if (sz > 0) sz = 0;
return to-unsigned-like(sz);

There are two problems worth noting here. First, as described in LWG 3739, ranges::distance(base_) and n_ may have different types, which makes the actual type of sz not deterministic. Also, the return type is unconditionally converted to an unsigned type, even though the underlying range may have a signed size type.

Second, even if V has the same difference_type as const V, there may still be integer promotion issues mentioned by LWG 3730 since we add an integer 1 at the end here.

I think converting sz to the size type of the underlying range before returning is the appropriate thing to do.

[2022-08-23; Reflector poll: NAD]

Paper author: "I did consider promotion and decided not to care. The code compiles and conforms to all ranges requirements, and that seems entirely sufficient to me." "Even if we don't outlaw those being different types entirely, people playing those games will still get exactly one unsigned-integer-like type back. It's totally deterministic."

[2022-11-30 LWG telecon. Status changed: Tentatively NAD → NAD.]

Proposed resolution:

This wording is relative to N4910.

  1. Modify 25.7.30.2 [range.slide.view] as indicated:

    constexpr auto size() requires sized_range<V>;
    constexpr auto size() const requires sized_range<const V>;
    

    -8- Effects: Equivalent to:

    auto sz = ranges::distance(base_) - n_ + 1;
    if (sz < 0) sz = 0;
    return static_cast<decltype(ranges::size(base_))>to-unsigned-like(sz);