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

Pio*_*ycz 5 c++ g++ language-lawyer c++20 std-ranges

请参阅此示例代码

#include <ranges>

int main() {
    for(auto i : std::ranges::iota_view(1) | std::views::reverse) 
        break;
}
Run Code Online (Sandbox Code Playgroud)

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

我还检查了不允许在无限范围内执行std::ranges::rbegin(inf)或操作std::ranges::rend(inf)(它无法编译)。

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

康桓瑋*_*康桓瑋 4

根据[iterator.requirements.general-10]

当且仅当存在使 的表达式的应用程序的有限序列时,哨兵s才被称为可从迭代器到达。如果可以从 到达,[ , ) 表示有效范围i++ii == ssiis

[iterator.requirements.general-12]

将库函数应用到无效范围的结果是未定义的。

由于ranges::iota_view(1)不是有效 range,因此应用于views::reverse它是未定义的行为。