Namespaces
Variants

std::experimental::ranges:: EqualityComparable, std::experimental::ranges:: EqualityComparableWith

From cppreference.net
Definido en el encabezado <experimental/ranges/concepts>
template < class T >
concept bool EqualityComparable = WeaklyEqualityComparableWith < T, T > ;
(1) (ranges TS)
template < class T, class U >

concept bool EqualityComparableWith =
EqualityComparable < T > &&
EqualityComparable < U > &&
CommonReference <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & > &&
EqualityComparable <
ranges:: common_reference_t <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & >> &&

WeaklyEqualityComparableWith < T, U > ;
(2) (ranges TS)
1) El concepto EqualityComparable<T> especifica que los operadores de comparación == y != en T reflejan igualdad: == produce true si y solo si los operandos son iguales.
EqualityComparable<T> se satisface solo si, dados los objetos a y b de tipo T , bool ( a == b ) es true si y solo si a y b son iguales. Junto con el requisito de que a == b preserva la igualdad, esto implica que == es simétrico y transitivo, y además que == es reflexivo para todos los objetos a que son iguales al menos a otro objeto.
2) El concepto EqualityComparableWith<T, U> especifica que los operadores de comparación == y != en operandos (posiblemente mixtos) de T y U producen resultados consistentes con la igualdad. Comparar operandos mixtos produce resultados equivalentes a comparar los operandos convertidos a su tipo común.
Formalmente, EqualityComparableWith<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 sea C igual a ranges:: common_reference_t < const std:: remove_reference_t < T > & , const std:: remove_reference_t < U > & > , bool ( t == u ) == bool ( C ( t ) == C ( u ) ) .

Preservación de la igualdad

Una expresión es equality preserving si produce 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 los hay).

Toda expresión que deba preservar la igualdad debe además ser estable : dos evaluaciones de dicha expresión con los mismos objetos de entrada deben producir salidas iguales, a menos que exista una modificación explícita e intermedia de esos objetos de entrada.

Variaciones de expresión implícita

Una requires-expression que utiliza una expresión que es no modificadora para algún operando constante lvalue también requiere implícitamente variaciones adicionales de esa expresión que acepten un lvalue no constante o un rvalue (posiblemente constante) para el operando dado, a menos que dicha variación de expresión sea explícitamente requerida con semántica diferente. Estas variaciones de expresión implícitas deben cumplir los mismos requisitos semánticos de la expresión declarada. El grado en que una implementación valida la sintaxis de las variaciones no está especificado.