| 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í.
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) |