这是正确的: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
是未定义的行为。
看这个例子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 iteratori
if and only if there is a finite sequence of applications of the expression++i
that makesi == s
. Ifs
is reachable fromi
, [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
是未定义的行为。