Espacios de nombres
Variantes
Acciones

std::equality_comparable, std::equality_comparable_with

De cppreference.com
< cpp‎ | concepts
Definido en el archivo de encabezado <concepts>
template<class T, class U>

  concept __WeaklyEqualityComparableWith = // solo exposición
    requires(const std::remove_reference_t<T>& t,
             const std::remove_reference_t<U>& u) {
      { t == u } -> boolean-testable;
      { t != u } -> boolean-testable;
      { u == t } -> boolean-testable;
      { u != t } -> boolean-testable;

    };
(1)
template < class T >
concept equality_comparable = __WeaklyEqualityComparableWith<T, T>;
(2) (desde C++20)
template <class T, class U>

concept equality_comparable_with =
  std::equality_comparable<T> &&
  std::equality_comparable<U> &&
  std::common_reference_with<
    const std::remove_reference_t<T>&,
    const std::remove_reference_t<U>&> &&
  std::equality_comparable<
    std::common_reference_t<
      const std::remove_reference_t<T>&,
      const std::remove_reference_t<U>&>> &&

  __WeaklyEqualityComparableWith<T, U>;
(3) (desde C++20)
1) El concepto de solo exposición __WeaklyEqualityComparableWith<T, U> especifica que un objeto de tipo T y un objeto de tipo U pueden compararse por igualdad entre sí (en cualquier orden) usando tanto == como !=, y los resultados de las comparaciones son consistentes.
2) El concepto equality_comparable<T> especifica que los operadores de comparación == y != en T reflejan igualdad: == produce true si y solo si los operandos son iguales.
3) El concepto equality_comparable_with<T, U> especifica que los operadores de comparación == y != en operandos (posiblemente mixtos) T y U producen resultados consistentes con igualdad. 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

1) __WeaklyEqualityComparableWith<T, U> se modela solamente si dados

lo siguiente es verdadero:

  • t == u, u == t, t != u,u != t tienen el mismo dominio;
  • bool(u == t) == bool(t == u);
  • bool(t != u) == !bool(t == u); y
  • bool(u != t) == bool(t != u).
2) equality_comparable<T> se modela 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 requerimiento que a == b es conservador de igualdad, esto implica que == es simétrico y transitivo, y además que == es reflexivo para todos los objetos a que son iguales a al menos otro objeto.
3) equality_comparable_with<T, U> se modela 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 std::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>, bool(t == u) == bool(C(t) == C(u)).

[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.