名前空間
変種
操作

C++ の名前付き要件: LegacyRandomAccessIterator

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

LegacyRandomAccessIterator は、定数時間で任意の要素を指すように移動できる LegacyBidirectionalIterator です。

LegacyRandomAccessIterator itContainer から生成された場合、itvalue_type はコンテナのそれと同じなので、逆参照 (*it) するとコンテナの value_type が得られます。

配列の要素へのポインタは、LegacyRandomAccessIterator のすべての要件を満たします。

目次

[編集] 要件

ItLegacyRandomAccessIterator を満たすのは、

さらに、以下が与えられたとき

  • value_typestd::iterator_traits<It>::value_type で表される型
  • difference_typestd::iterator_traits<It>::difference_type で表される型
  • referencestd::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;
else while (m++) --r;
return r;

  • n は正または負のどちらでもよい
  • 計算量は定数時間である(つまり、実装は演算意味論で示されている while ループを実際に実行することはできない)
a + n

n + a

It It temp = a;

return temp += n;

  • n は正または負のどちらでもよい
  • a + n == n + a
r -= n It& return r += -n; n の絶対値は difference_type の表現可能な値の範囲内である必要がある。
i - n It It temp = i;
return temp -= n;
b - a difference_type return n;
(事前条件を参照)

事前条件

  • difference_type 型の n が存在し、a + n == b を満たす

事後条件

  • b == a + (b - a).
i[n] reference に変換可能 *(i + n)
a < b

BooleanTestable を満たす

(C++20まで)

boolean-testable をモデル化する

(C++20以降)
return b - a > 0; と等価 事前条件
  • b - a と同じ

厳密な全順序関係

  • !(a < a)
  • a < b ならば !(b < a)
  • a < b かつ b < c ならば a < c
  • a < b または b < a または a == b
    (いずれか1つの式のみが真である)
a > b

BooleanTestable を満たす

(C++20まで)

boolean-testable をモデル化する

(C++20以降)
b < a a < b と反対の全順序関係
a >= b

BooleanTestable を満たす

(C++20まで)

boolean-testable をモデル化する

(C++20以降)
!(a < b)
a <= b

BooleanTestable を満たす

(C++20まで)

boolean-testable をモデル化する

(C++20以降)
!(a > b)

上記の規則は、LegacyRandomAccessIteratorLessThanComparable も実装していることを意味します。

ミュータブルな LegacyRandomAccessIterator は、さらに LegacyOutputIterator の要件を満たす LegacyRandomAccessIterator です。

コンセプト

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

template<class I>

concept __LegacyRandomAccessIterator =
    __LegacyBidirectionalIterator<I> && std::totally_ordered<I> &&
        requires(I i, typename std::incrementable_traits<I>::difference_type n)
        {
            { i += n } -> std::same_as<I&>;
            { i -= n } -> std::same_as<I&>;
            { i +  n } -> std::same_as<I>;
            { n +  i } -> std::same_as<I>;
            { i -  n } -> std::same_as<I>;
            { i -  i } -> std::same_as<decltype(n)>;
            {  i[n]  } -> std::convertible_to<std::iter_reference_t<I>>;

        };

ここで、展示のみのコンセプト __LegacyBidirectionalIteratorLegacyBidirectionalIterator で記述されています。

(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 - aa < b を使用して定義されていたため、
循環定義につながった
定義から a < b を削除
LWG 2114
(P2167R3)
C++98 bool への変換可能性は、実装の期待を反映するには弱すぎた 要件が強化された
  1. LWG issue 299 はこの解決後に再オープンされました。

[編集] 関連項目

bidirectional_iterator が、定数時間での移動と添字演算をサポートするランダムアクセスイテレータであることを規定する
(コンセプト) [編集]
イテレータライブラリ イテレータ、イテレータ特性、アダプタ、およびユーティリティ関数の定義を提供します。
English 日本語 中文(简体) 中文(繁體)