C++ の名前付き要件: LegacyRandomAccessIterator
LegacyRandomAccessIterator は、定数時間で任意の要素を指すように移動できる LegacyBidirectionalIterator です。
LegacyRandomAccessIterator it が Container から生成された場合、it の value_type はコンテナのそれと同じなので、逆参照 (*it) するとコンテナの value_type が得られます。
配列の要素へのポインタは、LegacyRandomAccessIterator のすべての要件を満たします。
目次 |
[編集] 要件
型 It が LegacyRandomAccessIterator を満たすのは、
- 型
Itが LegacyBidirectionalIterator を満たす場合
さらに、以下が与えられたとき
-
value_type、std::iterator_traits<It>::value_type で表される型 -
difference_type、std::iterator_traits<It>::difference_type で表される型 -
reference、std::iterator_traits<It>::reference で表される型 - i, a, b, 型
Itまたは const It のオブジェクト - r, 型
Itの左辺値 - n, 型
difference_typeの整数
以下の式は有効であり、指定された効果を持たなければなりません。
| Expression | 戻り値の型 | 操作的意味論 | 注釈 | ||||
|---|---|---|---|---|---|---|---|
| r += n | It&
|
difference_type m = n; if (m >= 0) while (m--) ++r; |
| ||||
| a + n
n + a |
It
|
It temp = a; return temp += n; |
| ||||
| r -= n | It& |
return r += -n; | n の絶対値は difference_type の表現可能な値の範囲内である必要がある。 | ||||
| i - n | It |
It temp = i; return temp -= n; |
|||||
| b - a | difference_type |
return n; (事前条件を参照) |
事前条件
事後条件
| ||||
| i[n] | reference に変換可能 |
*(i + n) | |||||
| a < b |
|
return b - a > 0; と等価 | 事前条件
厳密な全順序関係
| ||||
| a > b |
|
b < a | a < b と反対の全順序関係 | ||||
| a >= b |
|
!(a < b) | |||||
| a <= b |
|
!(a > b) |
上記の規則は、LegacyRandomAccessIterator が LessThanComparable も実装していることを意味します。
ミュータブルな LegacyRandomAccessIterator は、さらに LegacyOutputIterator の要件を満たす LegacyRandomAccessIterator です。
コンセプトstd::iterator_traits の定義のために、以下の exposition-only コンセプトが定義されています。
ここで、展示のみのコンセプト |
(C++20以降) |
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 299 (N3066) |
C++98 | a[n] の戻り値の型が要求された const value_type& に変換可能であること |
戻り値の型はreference に変換可能であること |
| LWG 448 | C++98 | a[n] の戻り値の型が要求されたvalue_type に変換可能であること |
戻り値の型は const value_type& に変換可能であること[1] |
| LWG 1079 | C++98 | b - a は a < b を使用して定義されていたため、 循環定義につながった |
定義から a < b を削除 |
| LWG 2114 (P2167R3) |
C++98 | bool への変換可能性は、実装の期待を反映するには弱すぎた | 要件が強化された |
- ↑ LWG issue 299 はこの解決後に再オープンされました。
[編集] 関連項目
| (C++20) |
bidirectional_iterator が、定数時間での移動と添字演算をサポートするランダムアクセスイテレータであることを規定する(コンセプト) |
| イテレータライブラリ | イテレータ、イテレータ特性、アダプタ、およびユーティリティ関数の定義を提供します。 |