名前空間
変種
操作

C++ 名前付き要件: LegacyInputIterator

From cppreference.com
 
 
C++ 名前付き要件
 

LegacyInputIterator は、ポインタ先の要素を読み取ることができる LegacyIterator です。LegacyInputIterator は、単一パスアルゴリズムでの有効性のみを保証します。一度 LegacyInputIterator i がインクリメントされると、その以前の値のすべてのコピーは無効になる可能性があります。

目次

[編集] 要件

定義
X 入力イテレータ型
T X値型(すなわち std::iterator_traits<X>::value_type
R std::iterator_traits<X>::reference
定義
i, j X または const X 型の値
r X& 型の値
その他 定義
m データメンバーまたはメンバー関数を可能性として示す識別子


X は、以下のすべての条件を満たす場合、LegacyInputIterator を満たす。

 式  セマンティクス
i != j
BooleanTestable を満たす型 (C++20まで)
boolean-testable をモデリングする型 (C++20以降)
事前条件 ij==ドメイン 内にある。
効果 !(i == j) と同等。
*i T に変換可能な R 事前条件 idereferenceable である。
効果
  • (void)*i, *i*i と同等である。
  • もし ij== のドメイン内にあり、かつ i == j ならば、 *i*j と同等である。
i->m 事前条件 i は dereferenceable である。
効果 (*i).m と同等。
++r X& 事前条件 r は dereferenceable である。
事後条件 
  • r は dereferenceable であるか、または r は past-the-end である。
  • r の以前の値のいかなるコピーも、もはや dereferenceable であること、または == のドメイン内にあることは要求されない。
(void)r++ 効果 (void)++r と同等。
*r++ T に変換可能 効果 T x = *r; ++r; return x; と同等。

[編集] 等価性ドメイン

== のドメインという用語は、通常の数学的な意味で、== を使用して比較できる値の集合を指すために使用される。この集合は時間とともに変化する可能性がある。

各アルゴリズムは、それが使用するイテレータ値の等価性ドメインに対して追加の要件を課す。これらの要件は、アルゴリズムが == および != をどのように使用するかから推測できる。

[編集] ノート

LegacyForwardIterator ではない入力イテレータ X について、 std::iterator_traits<X>::reference は参照型である必要はない。入力イテレータのデリファレンスは、プロキシオブジェクトを返すか、 std::iterator_traits<X>::value_type そのものを値で返すことがある(std::istreambuf_iterator の場合など)。

コンセプト

std::iterator_traits の定義のために、以下の exposition-only コンセプトが定義されています。

template<class I>

concept __LegacyInputIterator =
__LegacyIterator<I> && std::equality_comparable<I> && requires(I i)
{
    typename std::incrementable_traits<I>::difference_type;
    typename std::indirectly_readable_traits<I>::value_type;
    typename std::common_reference_t<std::iter_reference_t<I>&&,
                                     typename std::indirectly_readable_traits<I>::value_type&>;
    *i++;
    typename std::common_reference_t<decltype(*i++)&&,
                                     typename std::indirectly_readable_traits<I>::value_type&>;
    requires std::signed_integral<typename std::incrementable_traits<I>::difference_type>;

};

ここで、 exposition-only concept __LegacyIteratorLegacyIterator で説明されている。

(C++20以降)

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 98 C++98 *i++ の戻り値の型は T であることが要求されていた T に変換可能な任意の型でよい
LWG 2114
(P2167R3)
C++98 bool への変換可能性が弱すぎた
実装の期待を反映するために
要件が強化された

[編集] 関連項目

型が入力イテレータであること、すなわち、参照先の値を読み取ることができ、前置および後置インクリメントの両方が可能であることを規定する
(コンセプト) [編集]
イテレータライブラリ イテレータ、イテレータ特性、アダプタ、およびユーティリティ関数の定義を提供します。
English 日本語 中文(简体) 中文(繁體)