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 不用于实现此视图 - 那么这个实现是如何工作的?
根据[iterator.requirements.general-10]:
当且仅当存在使 的表达式的应用程序的有限序列时,哨兵
s才被称为可从迭代器到达。如果可以从 到达,[ , ) 表示有效范围。i++ii == ssiis
和[iterator.requirements.general-12]:
将库函数应用到无效范围的结果是未定义的。
由于ranges::iota_view(1)不是有效 range,因此应用于views::reverse它是未定义的行为。
| 归档时间: |
|
| 查看次数: |
530 次 |
| 最近记录: |