名稱空間
變體
操作

std::sentinel_for

來自 cppreference.com
 
 
迭代器庫
迭代器概念
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 來說過於寬鬆 已強化