这是正确的:std::views::reverse 在无限范围内吗?

Is this correct: std::views::reverse on infinite range?

看这个例子code:

#include <ranges>

int main() {
    for(auto i : std::ranges::iota_view(1) | std::views::reverse) 
        break;
}

它在 gcc 上编译(我无法检查 clang/msvc - 因为它们不支持范围)。 当然——它“永远”运行并且什么也不做。

我还检查过在无限范围内执行 std::ranges::rbegin(inf)std::ranges::rend(inf) 是不允许的(它不会编译)。

我不确定这是否是正确的 C++ 代码? 我很好奇 std::ranges::reverse 实现 - 看起来 rbegin/rend 没有用于实现这个视图 - 那么这个实现是如何工作的?

根据[iterator.requirements.general-10]

A sentinel s is called reachable from an iterator i if and only if there is a finite sequence of applications of the expression ++i that makes i == s. If s is reachable from i, [i, s) denotes a valid range.

[iterator.requirements.general-12]

The result of the application of library functions to invalid ranges is undefined.

由于 ranges::iota_view(1) 不是 有效范围 ,对其应用 views::reverse 是未定义的行为。