std::equality_comparable, std::equality_comparable_with
| Definiert in der Header-Datei <concepts> |
||
| template< class T > Konzept equality_comparable = __WeaklyEqualityComparableWith<T, T>; |
(1) | (seit C++20) |
| template< class T, class U > Konzept equality_comparable_with = |
(2) | (seit C++20) |
| Hilfskonzepte |
||
| template< class T, class U > Konzept __WeaklyEqualityComparableWith = |
(3) | (nur Exposition*) |
| (4) | ||
| template< class T, class U > Konzept __ComparisonCommonTypeWith = |
(bis C++23) (nur Exposition*) |
|
| template< class T, class U, class C = std::common_reference_t<const T&, const U&> > Konzept _ComparisonCommonTypeWithImpl = |
(seit C++23) (nur Exposition*) |
|
std::equality_comparable spezifiziert, dass die Vergleichsoperatoren == und != auf T die Gleichheit widerspiegeln: == ergibt true genau dann, wenn die Operanden gleich sind.std::equality_comparable_with spezifiziert, dass die Vergleichsoperatoren == und != auf (möglicherweise gemischten) T- und U-Operanden Ergebnisse liefern, die mit der Gleichheit übereinstimmen. Das Vergleichen gemischter Operanden liefert Ergebnisse, die äquivalent sind zum Vergleichen der Operanden, konvertiert zu ihrem gemeinsamen Typ.__WeaklyEqualityComparableWith spezifiziert, dass ein Objekt vom Typ T und ein Objekt vom Typ U mit einander (in beliebiger Reihenfolge) mittels beider Operatoren == und != auf Gleichheit verglichen werden können und die Ergebnisse der Vergleiche konsistent sind.__ComparisonCommonTypeWith spezifiziert, dass zwei Typen einen gemeinsamen Typ teilen und ein const Lvalue oder ein non-const Rvalue(seit C++23) eines der Typen in diesen gemeinsamen Typ konvertierbar ist.Inhalt |
[bearbeiten] Semantische Anforderungen
Diese Konzepte werden nur modelliert, wenn sie erfüllt sind und alle Konzepte, die sie umfassen, modelliert sind.
In den folgenden Absätzen ist, 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 == für alle Objekte a, die zu mindestens einem anderen Objekt gleich sind, reflexiv ist.-
tundt2sind Lvalues, die unterschiedliche, gleiche Objekte der Typen const std::remove_reference_t<T> und std::remove_cvref_t<T> bezeichnen, -
uundu2sind Lvalues, die unterschiedliche, gleiche Objekte der Typen const std::remove_reference_t<U> und std::remove_cvref_t<U> bezeichnen, -
Cist std::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>,
ist der folgende Ausdruck wahr
- 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>,
die folgenden Bedingungen erfüllt sind
- t == u, u == t, t != u, u != t haben dieselbe Domäne;
- 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
gelten die folgenden Bedingungen
|
(seit C++23) |
[bearbeiten] Gleichheitserhaltung
Ausdrücke, die in requires-Ausdrücken der Standardbibliothekskonzepte deklariert sind, müssen gleichheitserhaltend sein (sofern nicht anders angegeben).
[bearbeiten] Implizite Ausdrucksvariationen
Ein requires-Ausdruck, der einen Ausdruck verwendet, der für einen konstanten Lvalue-Operanden nicht-modifizierend ist, erfordert ebenfalls implizite Ausdrucksvariationen.
[bearbeiten] 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