Namespaces
Variants

std::experimental::ranges:: BidirectionalIterator

From cppreference.net
Definido en el encabezado <experimental/ranges/iterator>
template < class I >

concept bool BidirectionalIterator =
ForwardIterator < I > &&
DerivedFrom < ranges :: iterator_category_t < I > , ranges :: bidirectional_iterator_tag > &&
requires ( I i ) {
{ -- i } - > Same < I > & ;
{ i -- } - > Same < I > && ;

} ;
(ranges TS)

El concepto BidirectionalIterator<I> refina ForwardIterator añadiendo la capacidad de mover un iterador hacia atrás.

Un iterador bidireccional r se considera decrementable si y solo si existe algún s tal que ++ s == r . Todos los iteradores decrementables r deben estar en el dominio de las expresiones -- r y r -- .

Sean a y b objetos decrementables de tipo I . BidirectionalIterator<I> se satisface solo si:

  • El pre-decremento produce un lvalue que se refiere al operando: std:: addressof ( -- a ) == std:: addressof ( a ) .
  • El post-decremento produce el valor anterior del operando: si bool ( a == b ) , entonces bool ( a -- == b ) .
  • El post-decremento y pre-decremento realizan la misma modificación en su operando: Si bool ( a == b ) , entonces después de evaluar tanto a -- como -- b , bool ( a == b ) aún se cumple.
  • El incremento y decremento son inversos entre sí:
  • Si a es incrementable y bool ( a == b ) , entonces bool ( -- ( ++ a ) == b ) .
  • Si bool ( a == b ) , entonces bool ( ++ ( -- a ) == b ) .

Preservación de la igualdad

Una expresión es equality preserving si produce salidas iguales dadas entradas iguales.

  • Las entradas de una expresión consisten en sus operandos.
  • Las salidas de una expresión consisten en su resultado y todos los operandos modificados por la expresión (si los hay).

Toda expresión que deba preservar la igualdad debe además ser estable : dos evaluaciones de dicha expresión con los mismos objetos de entrada deben producir salidas iguales, a menos que exista una modificación explícita e intermedia de esos objetos de entrada.

A menos que se indique lo contrario, cada expresión utilizada en una requires-expression debe ser de preservación de igualdad y estable, y la evaluación de la expresión solo puede modificar sus operandos no constantes. Los operandos que son constantes no deben modificarse.