std::experimental::ranges:: EqualityComparable, std::experimental::ranges:: EqualityComparableWith
|
Definiert in Header
<experimental/ranges/concepts>
|
||
|
template
<
class
T
>
concept bool EqualityComparable = WeaklyEqualityComparableWith < T, T > ; |
(1) | (ranges TS) |
|
template
<
class
T,
class
U
>
concept
bool
EqualityComparableWith
=
|
(2) | (ranges TS) |
EqualityComparable<T>
spezifiziert, dass die Vergleichsoperatoren
==
und
!=
auf
T
Gleichheit widerspiegeln:
==
liefert
true
genau dann, wenn die Operanden gleich sind.
EqualityComparable<T>
ist nur dann erfüllt, wenn für Objekte
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 mindestens einem anderen Objekt gleich sind.
EqualityComparableWith<T, U>
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.
EqualityComparableWith<T, U>
nur dann erfüllt, wenn für jeden Lvalue
t
vom Typ
const
std::
remove_reference_t
<
T
>
und jeden Lvalue
u
vom Typ
const
std::
remove_reference_t
<
U
>
, und mit
C
als
ranges::
common_reference_t
<
const
std::
remove_reference_t
<
T
>
&
,
const
std::
remove_reference_t
<
U
>
&
>
,
bool
(
t
==
u
)
==
bool
(
C
(
t
)
==
C
(
u
)
)
gilt.
Gleichheitserhaltung
Ein Ausdruck ist gleichheitserhaltend , wenn er bei gleichen Eingaben gleiche Ausgaben liefert.
- Die Eingaben eines Ausdrucks bestehen aus seinen Operanden.
- Die Ausgaben eines Ausdrucks bestehen aus seinem Ergebnis und allen durch den Ausdruck modifizierten Operanden (falls vorhanden).
Jeder Ausdruck, der gleichungserhaltend sein muss, muss darüber hinaus stabil sein: Zwei Auswertungen eines solchen Ausdrucks mit denselben Eingabeobjekten müssen gleiche Ausgaben liefern, sofern keine explizite Änderung dieser Eingabeobjekte zwischen den Auswertungen erfolgt.
Implizite Ausdrucksvarianten
Ein requires-expression , der einen Ausdruck verwendet, der für einen konstanten Lvalue-Operanden nicht-modifizierend ist, erfordert implizit auch zusätzliche Variationen dieses Ausdrucks, die einen nicht-konstanten Lvalue oder (möglicherweise konstanten) Rvalue für den gegebenen Operanden akzeptieren, sofern nicht eine solche Ausdrucksvariation explizit mit abweichender Semantik gefordert wird. Diese impliziten Ausdrucksvariationen müssen dieselben semantischen Anforderungen erfüllen wie der deklarierte Ausdruck. Das Ausmaß, in dem eine Implementierung die Syntax der Variationen überprüft, ist nicht spezifiziert.