Namespaces
Variants

std:: sentinel_for

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(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 类型之间的关系,后者的值用于表示一个范围。仅用于阐述的概念 __WeaklyEqualityComparableWith equality_comparable 中有详细说明。

语义要求

s i 分别为类型 S I 的值,使得 [ i , s ) 表示一个 范围 。当且仅当满足以下条件时, sentinel_for<S, I> 才被建模:

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

== 的定义域可能随时间变化。给定迭代器 i 与哨位 s ,若 [ i , s ) 表示一个区间且 i ! = s ,则在递增任何等于 i 的迭代器后, [ i , s ) 不再被要求必须表示有效区间(因此在此类递增操作后, i == s 也不再被要求必须具有良定义)。

注释

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

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

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 适用范围 发布时的行为 正确行为
LWG 3453 C++20 sentinel_for 的语义要求对 ranges::advance 过于宽松 已加强