std::equality_comparable, std::equality_comparable_with
| Definido en el encabezado <concepts>
|
||
template< class T >
concept equality_comparable = __WeaklyEqualityComparableWith<T, T>;
|
(1) | (desde C++20) |
template< class T, class U >
concept equality_comparable_with =
std::equality_comparable<T> &&
std::equality_comparable<U> &&
__ComparisonCommonTypeWith<T, U> &&
std::equality_comparable<
std::common_reference_t<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>> &&
__WeaklyEqualityComparableWith<T, U>;
|
(2) | (desde C++20) |
| Conceptos auxiliares |
||
template< class T, class U >
concept __WeaklyEqualityComparableWith =
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;
};
|
(3) | (solo exposición*) |
template< class T, class U >
concept __ComparisonCommonTypeWith =
std::common_reference_with<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>;
|
(4) | (hasta C++23) (solo exposición*) |
template< class T, class U, class C = std::common_reference_t<const T&, const U&> >
concept _ComparisonCommonTypeWithImpl =
std::same_as<std::common_reference_t<const T&, const U&>,
std::common_reference_t<const U&, const T&>> &&
requires {
requires std::convertible_to<const T&, const C&> ||
std::convertible_to<T, const C&>;
requires std::convertible_to<const U&, const C&> ||
std::convertible_to<U, const C&>;
};
template< class T, class U >
concept __ComparisonCommonTypeWith =
_ComparisonCommonTypeWithImpl<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
|
(desde C++23) (solo exposición*) |
|
std::equality_comparable especifica que los operadores de comparación == y != en T reflejan igualdad: == produce true si y solo si los operandos son iguales.std::equality_comparable_with especifica que los operadores de comparación == y != en operandos (posiblemente mixtos) 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.__WeaklyEqualityComparableWith especifica que un objeto de tipo T y un objeto de tipo U pueden compararse por igualdad entre sí (en cualquier orden) usando ambos == y !=, y los resultados de las comparaciones son consistentes.__ComparisonCommonTypeWith especifica que dos tipos comparten un tipo común, y un const lvalue o un non-const rvalue(desde C++23) de cualquier tipo es convertible a ese tipo común.Requisitos semánticos
Estos conceptos se modelan solo si se satisfacen y todos los conceptos que subsumen están modelados.
En los siguientes párrafos, dada una expresión
E
y un tipo
C
,
CONVERT_TO
<
C
>
(
E
)
se define como:
|
(hasta C++23) |
|
(desde C++23) |
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
es
que 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.
-
tyt2lvalues que denoten objetos distintos e iguales de tipos const std:: remove_reference_t < T > y std:: remove_cvref_t < T > respectivamente, -
uyu2lvalues que denoten objetos distintos e iguales de tipos const std:: remove_reference_t < U > y std:: remove_cvref_t < U > respectivamente, -
Csea std:: common_reference_t < const std:: remove_reference_t < T > & , const std:: remove_reference_t < U > & > ,
la siguiente expresión es verdadera:
- bool ( t == u ) == bool ( CONVERT_TO < C > ( t2 ) == CONVERT_TO < C > ( u2 ) ) .
-
t, un lvalue de tipo const std:: remove_reference_t < T > y -
u, un lvalue de tipo const std:: remove_reference_t < U > ,
se cumplen las siguientes condiciones:
- 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 ) .
|
El concepto correspondiente
|
(hasta C++23) |
|
Sea
se cumplen las siguientes condiciones:
|
(desde C++23) |
Preservación de la igualdad
Las expresiones declaradas en las requires expressions de los conceptos de la biblioteca estándar deben ser equality-preserving (excepto cuando se indique lo contrario).
Variaciones de expresión implícita
Una requires expresión que utiliza una expresión que no modifica para algún operando constante lvalue también requiere variaciones de expresión implícitas .
Referencias
- Estándar C++23 (ISO/IEC 14882:2024):
-
-
18.5.4 Concepto
equality_comparable[concept.equalitycomparable]
-
18.5.4 Concepto
- Estándar C++20 (ISO/IEC 14882:2020):
-
-
18.5.3 Concepto
equality_comparable[concept.equalitycomparable]
-
18.5.3 Concepto