std::forward_iterator
| Definido en el archivo de encabezado <iterator>
|
||
template<class I> concept forward_iterator = std::input_iterator<I> && std::derived_from</*CONCEPTO_ITER*/<I>, std::forward_iterator_tag> && std::incrementable<I> && std::sentinel_for<I, I>; |
(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í.
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_conceptes válido y nombra un tipo,/*CONCEPTO_ITER*/<I>denota el tipo. - De lo contrario, si
RASGOS_ITER<I>::iterator_categoryes 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.
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
iyjtiene un resultado definido si
iyjson iteradores a la misma secuencia subyacente, o- tanto
icomojson 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
iyjson desreferenciables, ofrecen la garantía de múltiples pasadas, es decir:
i == jimplica++i == ++j, y((void)[](auto x){ ++x; }(i), *i)es equivalente a*i.
Notas
A diferencia de los requisitos de ForwardIterator, el concepto forward_iterator no requiere desreferenciabilidad para devolver un l-valor.
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) |