std::totally_ordered, std::totally_ordered_with
Definido en el archivo de encabezado <concepts>
|
||
template <class T> concept totally_ordered = |
(1) | (desde C++20) |
template <class T, class U> concept totally_ordered_with = |
(2) | (desde C++20) |
totally_ordered<T>
especifica que los operadores de comparación ==,!=,<,>,<=,>=
en T
producen resultados consistentes con un orden total estricto en T
.totally_ordered_with<T, U>
especifica que los operadores de comparación ==,!=,<,>,<=,>=
en operandos (posiblemente mixtos) T
y U
producen resultados consistentes con un orden total estricto. La comparación de operandos mixtos produce resultados equivalentes a la comparación de los operandos convertidos a su tipo común.[editar] Requerimientos semánticos
totally_ordered<T>
se modela solo si, dados los lvalues a
, b
y c
de tipo const std::remove_reference_t<T>:
- Exactamente uno de bool(a < b), bool(a > b) y bool(a == b) es true;
- Si tanto bool(a < b) como bool(b < c) son true, entonces bool(a < c) es true;
- bool(a > b) == bool(b < a)
- bool(a >= b) == !bool(a < b)
- bool(a <= b) == !bool(b < a)
totally_ordered_with<T, U>
se satisface solo si, dado cualquier lvalue t
de tipo const std::remove_reference_t<T> y cualquier lvalue u
de tipo const std::remove_reference_t<U>, y dejemos que C
sea std::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&> :
- bool(t < u) == bool(C(t) < C(u))
- bool(t > u) == bool(C(t) > C(u))
- bool(t <= u) == bool(C(t) <= C(u))
- bool(t >= u) == bool(C(t) >= C(u))
- bool(u < t) == bool(C(u) < C(t))
- bool(u > t) == bool(C(u) > C(t))
- bool(u <= t) == bool(C(u) <= C(t))
- bool(u >= t) == bool(C(u) >= C(t))
[editar] Conservación de la igualdad
Una expresión es conservadora de igualdad si resulta en 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 es que los hay).
Cada expresión que se requiere sea conservadora de igualdad, se requiere además que sea estable: dos evaluaciones de tal expresión con los mismos objetos de entrada debe tener salidas iguales si no se encuentra alguna modificación interventora de esos objetos de entrada.
A menos que se indique de otra manera, cada expresión utilizada en una expresión-requiere se requiere sea conservadora de igualdad y estable, y la evaluación de la expresión puede solamente modificar sus operandos no constantes. Los operandos que son constantes no deben ser modificados.
[editar] Variaciones de expresión implícita
Una expresión-requiere que usa una expresión que no es modificable para algún operando l-valor constante también requiere implícitamente variaciones adicionales de esa expresión que acepten un l-valor no constante o un r-valor (posiblemente constante) para el operando dado, a menos que tal variación de expresión se requiera explícitamente con semánticas discrepantes. Estas variaciones de expresión implícita deben cumplir con los mismos requerimientos semánticos de la expresión declarada. No se especifica hasta qué punto una implementación valida la sintaxis de las variaciones.