slide_view::size should preserve the signedness of underlying range's size
Hewill Kang

Created on 2022-07-15.00:00:00 last changed 4 weeks ago


Date: 2022-07-17.10:53:19

Proposed resolution:

This wording is relative to N4910.

  1. Modify [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);

Date: 2022-07-17.12:14:27

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.

Date User Action Args
2022-07-16 18:04:10adminsetmessages: + msg12596
2022-07-15 00:00:00admincreate