std::sentinel_for
來自 cppreference.com
< cpp | 迭代器 (iterator)
定義於標頭檔案 <iterator> |
||
template< class S, class I > concept sentinel_for = |
(C++20 起) | |
sentinel_for
概念指定了一個 input_or_output_iterator
型別和一個 semiregular
型別之間的關係,其中 semiregular
型別的值表示一個範圍。僅用於說明的 __WeaklyEqualityComparableWith
概念在 equality_comparable
中有描述。
[edit] 語義要求
令 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 不再要求是良定義的)。
[edit] 注意
哨兵型別及其對應的迭代器型別不要求建模 equality_comparable_with
,因為哨兵型別可能無法與自身進行比較,並且它們不要求具有共同的引用型別。
自 C++17 起,在基於範圍的 for
迴圈中允許使用與迭代器型別不同的哨兵型別。
[edit] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3453 | C++20 | sentinel_for 的語義要求對於 ranges::advance 來說過於寬鬆 |
已強化 |