命名空间
变体
操作

std::sentinel_for

来自 cppreference.cn
 
 
迭代器库
迭代器概念
sentinel_for
(C++20)

迭代器原语
算法概念与工具
间接可调用概念
常用算法要求
(C++20)
(C++20)
(C++20)
工具
(C++20)
迭代器适配器
范围访问
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
定义于头文件 <iterator>
template< class S, class I >

    concept sentinel_for =
        std::semiregular<S> &&
        std::input_or_output_iterator<I> &&

        __WeaklyEqualityComparableWith<S, I>;
(C++20 起)

sentinel_for 概念指定了一个 input_or_output_iterator 类型和一个 semiregular 类型之间的关系,其中 semiregular 类型的值表示一个范围。仅用于说明的 __WeaklyEqualityComparableWith 概念在 equality_comparable 中有描述。

[edit] 语义要求

si 分别是类型 SI 的值,使得 [is) 表示一个 范围sentinel_for<S, I> 仅在以下情况被建模:

  • i == s 是良定义的。
  • 如果 bool(i != s) 为真,则 i 是可解引用的,且 [++is) 表示一个范围。
  • std::assignable_from<I&, S> 要么被建模,要么不满足。

== 的域可以随时间改变。给定迭代器 i 和哨兵 s,使得 [is) 表示一个范围且 i != s,在递增任何等于 i 的迭代器之后,[is) 不要求继续表示一个范围(因此在这种递增之后,i == s 不再要求是良定义的)。

[edit] 注意

哨兵类型及其对应的迭代器类型不要求建模 equality_comparable_with,因为哨兵类型可能无法与自身进行比较,并且它们不要求具有共同的引用类型。

自 C++17 起,在基于范围的 for 循环中允许使用与迭代器类型不同的哨兵类型。

[edit] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 3453 C++20 sentinel_for 的语义要求对于 ranges::advance 来说过于宽松 已强化