std::experimental::ranges::BidirectionalIterator
| Defined in header <experimental/ranges/iterator> |
||
| template< class I > concept bool BidirectionalIterator = |
(ranges TS) | |
concept BidirectionalIterator<I> は、イテレータを後方に移動する能力を追加することで、 ForwardIterator を改良したものです。
双方向イテレータ r は、ある s が存在して ++s == r となる場合に、デクリメント可能であると言います。すべてのデクリメント可能なイテレータ r は、式 --r および r-- のドメイン内にある必要があります。
a と b を型 I のデクリメント可能なオブジェクトとします。BidirectionalIterator<I> が満たされるのは、以下の場合のみです。
- プリデクリメントはオペランドを参照するlvalueを返します: std::addressof(--a) == std::addressof(a)。
- ポストデクリメントはオペランドの以前の値を返します: bool(a == b) の場合、 bool(a-- == b)。
- ポストデクリメントとプリデクリメントは、オペランドに対して同じ変更を行います: bool(a == b) の場合、 a-- と --b の両方を評価した後でも、 bool(a == b) は依然として成り立ちます。
- インクリメントとデクリメントは互いの逆演算です。
aがインクリメント可能で、 bool(a == b) である場合、 bool(--(++a) == b)。- bool(a == b) の場合、 bool(++(--a) == b)。
[編集] 等価性保持
式が**等価性保持**であるとは、等しい入力に対して等しい出力を生成することを意味します。
- 式の入力は、そのオペランドで構成されます。
- 式の出力は、その結果と、式によって変更されたすべてのオペランド(存在する場合)で構成されます。
等価性保持が要求されるすべての式は、さらに**安定**である必要があります。同じ入力オブジェクトでそのような式の2回の評価は、これらの入力オブジェクトの明示的な介入的な変更がない限り、等しい出力を持ちます。
特に断りがない限り、requires-expression で使用されるすべての式は、等価性を保持し、安定であることが要求され、式の評価は定数でないオペランドのみを変更できます。定数のオペランドは変更してはいけません。