std::sentinel_for
From cppreference.com
| ヘッダ <iterator> で定義 |
||
| template< class S, class I > concept sentinel_for = |
(C++20以降) | |
sentinel_forコンセプトは、input_or_output_iterator型と、範囲を表すsemiregular型の間の関係を指定します。露出専用コンセプト__WeaklyEqualityComparableWithは、equality_comparableで説明されています。
[編集] 意味要件
SおよびI型の値として、それぞれsおよびiがあり、[i, s)が範囲を表すとします。sentinel_for<S, I>は、次の場合にのみモデル化されます。
- i == sがwell-definedである。
- もしbool(i != s)ならば、
iはデリファレンス可能であり、[++i,s)は範囲を表します。 - std::assignable_from<I&, S>は、モデル化されるか、または満たされないかのどちらかです。
==のドメインは時間とともに変化する可能性があります。イテレータiとセ ンチネルsが与えられ、[i, s)が範囲を表し、i != sである場合、iに等しい任意のイテレータをインクリメントした後も[i, s)が範囲を表し続けることは要求されていません(したがって、そのようなインクリメントの後でi == sがwell-definedであることが要求されなくなります)。
[編集] 注釈
センチネル型とその対応するイテレータ型は、equality_comparable_withをモデル化する必要はありません。これは、センチネル型がそれ自体と比較可能ではない可能性があり、共通の参照型を持つことが要求されないためです。
C++17以降、範囲ベースforループでセンチネル型をイテレータ型と異なるものとして使用することが許可されています。
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3453 | C++20 | sentinel_forの意味要件は、ranges::advanceには緩すぎた |
強化された |