std::weakly_incrementable
| Definido en el archivo de encabezado <iterator>
|
||
template<class I> concept weakly_incrementable = std::movable<I> && requires(I i) { typename std::iter_difference_t<I>; requires /*es-similar-a-entero-con-signo*/<std::iter_difference_t<I>>; { ++i } -> std::same_as<I&>; // no se requiere que conserve la igualdad i++; // no se requiere que conserve la igualdad }; |
(desde C++20) | |
Donde /*es-similar-a-entero-con-signo*/<I> es true si y solo si I es un tipo similar a un entero con signo (véase a continuación).
Este concepto especifica los requerimientos que deben cumplir los tipos que se pueden incrementar con los operadores de preincremento y posincremento, pero cuyas operaciones de incremento no necesariamente conservan la igualdad, y no se requiere que el tipo en sí sea std::equality_comparable.
Para los tipos std::weakly_incrementable, a == b no implica que ++a == ++b. Los algoritmos de tipos débilmente incrementables deben ser algoritmos de un solo paso. Estos algoritmos se pueden usar con flujos de entrada como fuente de datos de entrada a través de std::istream_iterator.
Requerimientos semánticos
I modela std::weakly_incrementable solo si dado un objeto i de tipo I:
- Las expresiones
++iyi++tienen el mismo dominio. - Si
ies incrementable, entonces tanto++icomoi++avanzan ai. - Si
ies incrementable, entoncesstd::addressof(++i) == std::addressof(i).
Tipos similares a enteros
Un tipo similar a un entero es un tipo entero (posiblemente calificado-cv) (excepto para cv bool) o una clase proporcionada por la implementación (más no proporcionada por el usuario) que se comporta como un tipo entero, incluidos todos los operadores, conversiones implícitas y especializaciones de std::numeric_limits. Si un tipo similar a un entero solo representa valores no negativos, es similar a un entero sin signo; de lo contrario, es similar a un entero con signo.
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3467 | C++20 | bool se consideraba un tipo similar a un entero.
|
Se excluyó. |
| P2325R3 | C++20 | Se requería el concepto default_initializable.
|
No se requiere. |
Véase también
(C++20) |
Especifica que la operación de incremento en un tipo weakly_incrementable es conservadora de la igualdad y que el tipo es equality_comparable. (concepto) |