Namespaces
Variants

C++ named requirements: LegacyForwardIterator

From cppreference.net
C++ named requirements

LegacyForwardIterator は、指し示す要素からデータを読み取ることができる LegacyIterator です。

LegacyInputIterator LegacyOutputIterator とは異なり、マルチパスアルゴリズムで使用できます。

LegacyForwardIterator it Container に由来する場合、 it の値型はコンテナの値型と同じであるため、デリファレンス( * it )によってコンテナの値型が得られます。

目次

要件

定義
X 前方イテレータ型
T X 値型 (すなわち std:: iterator_traits < X > :: value_type
Ref std:: iterator_traits < X > :: reference
定義
i j X 型または const X 型の値
r X& 型の値

X は以下の条件をすべて満たす場合、 LegacyForwardIterator を満たします:

  • X LegacyInputIterator を満たす。
  • X DefaultConstructible を満たす。
  • X 変更可能なイテレータ である場合、 Ref T への参照である。
  • X が定数イテレータである場合、 Ref const T への参照である。
  • X 型のオブジェクトは マルチパス保証 を提供する。
  • i j が等しい場合、 i j の両方が デリファレンス可能 であるか、あるいはどちらもデリファレンス可能でないかのいずれかである。
  • i j の両方がデリファレンス可能である場合、 i == j であるのは * i * j が同じオブジェクトにバインドされている場合に限る。
  • 以下の式は有効であり、指定された効果を持たなければならない:
効果
r ++ convertible to const X & 次と等価: X x = r ;
++ r ;
return x ;
.
* i ++ Ref

等価性ドメイン

前方イテレータにおける domain == は、同じ underlying sequence 上のイテレータに適用されます。

しかしながら、 value-initialized 前方イテレータは比較可能であり、同じ型の他の value-initialized イテレータと等しく比較されなければなりません。

言い換えれば、value-initialized 前方イテレータは、同じ空のシーケンスの終端を指しているかのように振る舞います。

(C++14 以降)

マルチパス保証

二つの逆参照可能なイテレータ a b が型 X において マルチパス保証 を提供するのは、以下の全ての条件が満たされる場合です:

  • a == b ++ a == ++ b を意味する。
  • 以下のいずれかの条件が満たされる:
  • X はポインタ型です。
  • ( void ) ++ X ( a ) , * a は式 * a と等価です。

Concept

std::iterator_traits の定義のために、以下の説明専用コンセプトが定義される。

template < class It >

concept __LegacyForwardIterator =
__LegacyInputIterator < It > && std:: constructible_from < It > &&
std:: is_reference_v < std:: iter_reference_t < It >> &&
std:: same_as <
std:: remove_cvref_t < std:: iter_reference_t < It >> ,
typename std:: indirectly_readable_traits < It > :: value_type > &&
requires ( It it ) {
{ it ++ } - > std:: convertible_to < const It & > ;
{ * it ++ } - > std:: same_as < std:: iter_reference_t < It >> ;

} ;

説明専用コンセプト __LegacyInputIterator<T> LegacyInputIterator で説明されている。

(C++20以降)

注記

std::forward_iterator コンセプトとは異なり、 LegacyForwardIterator 要件は間接参照が参照を返すことを要求します。

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 1212
( N3066 )
C++98 * i ++ の型が
LegacyBidirectionalIterator で要求される
* i -- の型と一致していなかった
型を Ref に変更
LWG 1311
( N3066 )
C++98 a == b ++ a == ++ b を意味する」だけでは
マルチパス保証を提供しない [1]
a == b
++ a ! = b を意味する」も要求 [2]
LWG 3798 C++20 __LegacyForwardIterator
std:: iter_reference_t < It > が左辺値参照型であることを要求
右辺値参照型も
許可する
  1. a b が同じ基盤イテレータを使用するシナリオにおいて、式 ++ a == ++ b を評価すると、実際には基盤コンテナが2回インクリメントされるが、結果は依然として true となる。
  2. 形式的には ++ b ! = a を含意することも必要とされる。

関連項目

input_iterator が前方イテレータであることを指定し、等値比較とマルチパスをサポートする
(コンセプト)
Iterator library イテレータ、イテレータ特性、アダプタ、およびユーティリティ関数の定義を提供する