Section: 26.7.20 [range.reverse] Status: New Submitter: Barry Revzin Opened: 2023-11-25 Last modified: 2023-11-27 15:53:21 UTC
Priority: Not Prioritized
View all other issues in [range.reverse].
View all issues with New status.
Discussion:
Consider the following:
auto a = views::iota(0) | views::reverse; auto b = views::repeat(42) | views::reverse;
Here, views::iota(0) and views::repeat(42) are both non-common bidirectional (even random-access) ranges. They are also infinite ranges, even if the standard doesn't really recognize that.
views::reverse on a non-common range will actually compute the end iterator for you. So while both declarations of a and b above compile, attempting to use either in any way will lead to an infinite loop when you try a.begin() or b.begin(). A reddit post suggested disallowing reversing a non-common range but that likely breaks reasonable use-cases. We could at the very least recognize ranges whose sentinel is unreachable_t and reject those from consideration. For instance, we could change 25.4.4.4 [range.iter.op.next]/3 to Mandate that S is not unreachable_t.Proposed resolution: