std::forward_iterator
Definido en el archivo de encabezado <iterator>
|
||
template<class I> concept forward_iterator = |
(desde C++20) | |
El concepto forward_iterator
es un refinamiento de std::input_iterator requiriendo que I
también modele std::incrementable
(lo que lo hace adecuado para algoritmos de múltiples pasadas), y garantizando que dos iteradores del mismo rango se puedan comparar entre sí.
Contenido |
[editar] Determinación del concepto de iterador
La definición de este concepto se especifica mediante una plantilla de alias de solo exposición /*CONCEPTO_ITER*/.
Para determinar /*CONCEPTO_ITER*/<I>, dejemos que RASGOS_ITER<I> denote I si la especialización std::iterator_traits<I> se genera a partir de la plantilla principal, o std::iterator_traits<I> de lo contrario:
- Si RASGOS_ITER<I>::iterator_concept es válido y nombra un tipo, /*CONCEPTO_ITER*/<I> denota el tipo.
- De lo contrario, si RASGOS_ITER<I>::iterator_category es válido y nombra un tipo, /*CONCEPTO_ITER*/<I> denota el tipo.
- De lo contrario, si std::iterator_traits <I> se genera a partir de la plantilla principal, /*CONCEPTO_ITER*/<I> denota std::random_access_iterator_tag.
- De lo contrario, /*CONCEPTO_ITER*/<I> no denota un tipo y da como resultado un error de sustitución.
[editar] Requisitos semánticos
I
modela std::forward_iterator
si, y solo si I
modela todos los conceptos que subsume, y dados los objetos i
y j
de tipo I
:
- La comparación entre los iteradores
i
yj
tiene un resultado definido si
-
i
yj
son iteradores a la misma secuencia subyacente, o - tanto
i
comoj
son inicializados por valor, en cuyo caso se comparan iguales.
-
- Los punteros y las referencias obtenidas a partir de un iterador de avance siguen siendo válido mientras exista el rango.
- Si
i
yj
son desreferenciables, ofrecen la garantía de múltiples pasadas, es decir:
-
i == j
implica++i == ++j
, y - ((void)[](auto x){ ++x; }(i), *i) es equivalente a
*i
.
-
[editar] Notas
A diferencia de los requisitos de ForwardIterator, el concepto forward_iterator
no requiere desreferenciabilidad para devolver un l-valor.
[editar] Véase también
Especifica que un tipo es un iterador de entrada. Es decir, sus valores referenciados pueden leerse y ser tanto preincrementados como posincrementados. (concepto) |