Namespaces
Variants

C++ named requirements: LegacyBidirectionalIterator

From cppreference.net
C++ named requirements

A LegacyBidirectionalIterator は、双方向(すなわちインクリメントおよびデクリメント)に移動可能な LegacyForwardIterator です。

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

目次

要件

It は、以下の条件を満たす場合に LegacyBidirectionalIterator を満たします

そして、与えられた

  • a b 、型 It の左辺値
  • reference std:: iterator_traits < It > :: reference によって示される型

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

戻り値 同等の式 注記
-- 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

可変( mutable LegacyBidirectionalIterator は、 LegacyBidirectionalIterator であり、さらに LegacyOutputIterator の要件を満たすものである。

注記

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

双方向イテレータはデクリメント可能であるためにデリファレンス可能である必要はありません(特に、終端イテレータはデリファレンス可能ではありませんがデクリメント可能です)。

Concept

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

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 >> ;

} ;

説明専用コンセプト __LegacyForwardIterator LegacyForwardIterator で説明されている。

(C++20以降)

不具合報告

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

DR 適用対象 公開時の仕様 正しい仕様
LWG 299
( N3066 )
C++98 * a -- の戻り値型は
T への変換可能が要求されていた
戻り値型を reference に変更 [1]
LWG 383 C++98 -- a 実行後の b が間接参照可能であることが要求されていた 代わりに a が間接参照可能であることが要求される
LWG 1212
( N3066 )
C++98 * a -- の戻り値型が LegacyForwardIterator が要求する
* a ++ の戻り値型と一致していなかった
戻り値型を reference に変更
  1. この問題は当初 N2758 (iterator concepts) によって解決されていたが、後にC++標準から削除された。

関連項目

forward_iterator が双方向イテレータであることを指定し、後方への移動をサポートする
(コンセプト)
Iterator library イテレータ、イテレータ特性、アダプタ、およびユーティリティ関数の定義を提供する