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
=
|
(2) | (seit C++20) |
|
Hilfskonzepte
|
||
|
template
<
class
T,
class
U
>
concept __WeaklyEqualityComparableWith
=
|
(3) | ( nur zur Darstellung* ) |
| (4) | ||
|
template
<
class
T,
class
U
>
concept __ComparisonCommonTypeWith
=
|
(bis C++23)
( nur zur Darstellung* ) |
|
|
template
<
class
T,
class
U,
class
C
=
std::
common_reference_t
<
const
T
&
,
const
U
&
>
>
concept _ComparisonCommonTypeWithImpl
=
|
(seit C++23)
( nur zur Darstellung* ) |
|
std::equality_comparable
spezifiziert, dass die Vergleichsoperatoren
==
und
!=
auf
T
Gleichheit widerspiegeln:
==
liefert
true
genau dann, wenn die Operanden gleich sind.
std::equality_comparable_with
spezifiziert, dass die Vergleichsoperatoren
==
und
!=
für (möglicherweise gemischte)
T
und
U
Operanden Ergebnisse liefern, die mit Gleichheit konsistent sind. Der Vergleich gemischter Operanden liefert Ergebnisse, die äquivalent zum Vergleich der in ihren gemeinsamen Typ konvertierten Operanden sind.
__WeaklyEqualityComparableWith
spezifiziert, dass ein Objekt vom Typ
T
und ein Objekt vom Typ
U
miteinander auf Gleichheit verglichen werden können (in beliebiger Reihenfolge) unter Verwendung von sowohl
==
als auch
!=
, 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
(since C++23)
eines der beiden Typen zu diesem gemeinsamen Typ konvertierbar ist.
Inhaltsverzeichnis |
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