名前空間
変種
操作

C++ 名前付き要件: LegacyBidirectionalIterator

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

LegacyBidirectionalIterator は、双方向に移動できる(すなわち、インクリメントとデクリメントができる)LegacyForwardIterator です。

LegacyBidirectionalIterator itContainer から生成された場合、itvalue_type はコンテナのものと同じであり、したがって間接参照(*it)はコンテナの value_type を取得します。

目次

[編集] 要件

ItLegacyBidirectionalIterator を満たすのは、次の場合です。

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

  • a および b、型 It の左辺値
  • referencestd::iterator_traits<It>::reference で示される型

以下の式は有効であり、指定された効果を持たなければなりません。

Expression 戻り値 等価な式 注釈
--a It& 事前条件
  • a はデクリメント可能である(a == ++b となるような b が存在する)。

事後条件

  • a間接参照可能である。
  • --(++a) == a
  • もし --a == --b ならば a == b
  • a--a は同じイテレータオブジェクトを指す。
a-- への変換可能 const It& It temp = a;

--a;

return temp;
*a-- reference

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

[編集] 注釈

beginイテレータはデクリメント可能ではなく、--container.begin() が評価された場合の動作は未定義です。

双方向イテレータは、デクリメント可能であるために間接参照可能である必要はありません(特に、endイテレータは間接参照可能ではありませんが、デクリメント可能です)。

コンセプト

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

template<class I>

concept __LegacyBidirectionalIterator =
    __LegacyForwardIterator<I> && requires(I i)
    {
        {  --i } -> std::same_as<I&>;
        {  i-- } -> std::convertible_to<const I&>;
        { *i-- } -> std::same_as<std::iter_reference_t<I>>;

    };

ここで、説明専用コンセプト __LegacyForwardIteratorLegacyForwardIterator で説明されています。

(C++20以降)

[編集] 不具合報告

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

DR 適用対象 公開された動作 正しい動作
LWG 299
(N3066)
C++98 *a-- の戻り値の型が
T に変換可能であると
要求されていたが、
戻り値の型がreferenceに変更された[1]
LWG 383 C++98 --a の後で b が間接参照可能であると 要求されていたが、代わりに a が間接参照可能であると
要求されるようになった。
(N3066)
C++98 LWG 1212
*a-- の戻り値の型が、LegacyForwardIterator で要求される *a++ の戻り値の型と一致していなかった。
要求されていたが、
戻り値の型をreferenceにした。
  1. この問題は当初、イテレータコンセプトである N2758 によって解決されましたが、後に C++ 標準から削除されました。

[編集] 関連項目

forward_iterator が、後方への移動をサポートする双方向イテレータであることを規定する
(コンセプト) [編集]
イテレータライブラリ イテレータ、イテレータ特性、アダプタ、およびユーティリティ関数の定義を提供します。
English 日本語 中文(简体) 中文(繁體)