std::equality_comparable, std::equality_comparable_with
| Definiert in Header <concepts>
|
||
template< class T >
concept equality_comparable = __WeaklyEqualityComparableWith<T, T>;
|
(1) | (seit 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) | (seit C++20) |
| Hilfskonzepte |
||
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) | (nur zur Veranschaulichung*) |
template< class T, class U >
concept __ComparisonCommonTypeWith =
std::common_reference_with<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>;
|
(4) | (bis C++23) (nur zur Veranschaulichung*) |
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>>;
|
(seit C++23) (nur zur Veranschaulichung*) |
|
std::equality_comparable legt fest, dass die Vergleichsoperatoren == und != auf T die Gleichheit widerspiegeln: == ergibt true genau dann, wenn die Operanden gleich sind.std::equality_comparable_with legt fest, dass die Vergleichsoperatoren == und != auf (möglicherweise gemischten) T und U Operanden Ergebnisse liefern, die mit der Gleichheit konsistent sind. Der Vergleich gemischter Operanden liefert Ergebnisse, die dem Vergleich der in ihren gemeinsamen Typ konvertierten Operanden entsprechen.__WeaklyEqualityComparableWith legt fest, dass ein Objekt vom Typ T und ein Objekt vom Typ U mit beiden Operatoren == und != auf Gleichheit miteinander (in beliebiger Reihenfolge) verglichen werden können, und die Ergebnisse der Vergleiche sind konsistent.__ComparisonCommonTypeWith legt fest, dass zwei Typen einen gemeinsamen Typ teilen, und ein const lvalue oder ein nicht-const rvalue(seit C++23) jedes der beiden Typen in diesen gemeinsamen Typ konvertierbar ist.Semantische Anforderungen
Diese Konzepte sind nur modelliert, wenn sie erfüllt sind und alle Konzepte, die sie subsumieren, modelliert sind.
In den folgenden Absätzen wird, gegeben ein Ausdruck
E
und ein Typ
C
,
CONVERT_TO
<
C
>
(
E
)
definiert als:
|
(bis C++23) |
|
(seit C++23) |
a
und
b
vom Typ
T
,
bool
(
a
==
b
)
genau dann
true
ist, wenn
a
und
b
gleich sind. Zusammen mit der Anforderung, dass
a
==
b
gleichheitserhaltend
ist, impliziert dies, dass
==
symmetrisch und transitiv ist, und weiterhin, dass
==
reflexiv für alle Objekte
a
ist, die zu mindestens einem anderen Objekt gleich sind.
-
tundt2Lvalues, die unterschiedliche gleiche Objekte der Typen const std:: remove_reference_t < T > und std:: remove_cvref_t < T > bezeichnen, -
uundu2Lvalues, die unterschiedliche gleiche Objekte der Typen const std:: remove_reference_t < U > und std:: remove_cvref_t < U > bezeichnen, -
Csei std:: common_reference_t < const std:: remove_reference_t < T > & , const std:: remove_reference_t < U > & > ,
der folgende Ausdruck wahr ist:
- bool ( t == u ) == bool ( CONVERT_TO < C > ( t2 ) == CONVERT_TO < C > ( u2 ) ) .
-
t, ein Lvalue vom Typ const std:: remove_reference_t < T > und -
u, ein Lvalue vom Typ const std:: remove_reference_t < U > ,
Folgendes zutrifft:
- t == u , u == t , t ! = u , u ! = t dieselbe Domäne haben;
- bool ( u == t ) == bool ( t == u ) ;
- bool ( t ! = u ) == ! bool ( t == u ) ; und
- bool ( u ! = t ) == bool ( t ! = u ) .
|
Das entsprechende
|
(bis C++23) |
|
Seien
dann gelten folgende Bedingungen:
|
(seit C++23) |
Gleichheitserhaltung
Ausdrücke, die in requires expressions der Standardbibliothek-Konzepte deklariert werden, müssen equality-preserving sein (sofern nicht anders angegeben).
Implizite Ausdrucksvarianten
Ein requires -Ausdruck , der einen Ausdruck verwendet, der für einen konstanten Lvalue-Operanden nicht-modifizierend ist, erfordert ebenfalls implizite Ausdrucksvarianten .
Referenzen
- C++23-Standard (ISO/IEC 14882:2024):
-
-
18.5.4 Konzept
equality_comparable[concept.equalitycomparable]
-
18.5.4 Konzept
- C++20-Standard (ISO/IEC 14882:2020):
-
-
18.5.3 Konzept
equality_comparable[concept.equalitycomparable]
-
18.5.3 Konzept