Namensräume
Varianten
Aktionen

std::experimental::ranges::EqualityComparable, std::experimental::ranges::EqualityComparableWith

Von cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
Konzeptbibliothek
Kernsprachen-Konzepte
                              
Objektkonzepte
                              
                              
Vergleichskonzepte
EqualityComparableEqualityComparableWith
Aufrufbare Konzepte
                                        
                              
URNG-Konzept
 
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 =
    EqualityComparable<T> &&
    EqualityComparable<U> &&
    CommonReference<
        const std::remove_reference_t<T>&,
        const std::remove_reference_t<U>&> &&
    EqualityComparable<
        ranges::common_reference_t<
            const std::remove_reference_t<T>&,
            const std::remove_reference_t<U>&>> &&

    WeaklyEqualityComparableWith<T, U>;
(2) (Ranges TS)
1) Das Konzept EqualityComparable<T> spezifiziert, dass die Vergleichsoperatoren == und != auf T die 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 gilt: bool(a == b) ist true genau dann, wenn a und b gleich sind. Zusammen mit der Anforderung, dass a == b gleichheitserhaltend ist, impliziert dies, dass == symmetrisch und transitiv ist, und weiter, dass == reflexiv für alle Objekte a ist, die mindestens einem anderen Objekt gleich sind.
2) Das Konzept EqualityComparableWith<T, U> spezifiziert, 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 äquivalent zu einem Vergleich der Operanden sind, die in ihren gemeinsamen Typ konvertiert wurden.
Formal ist 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> gilt: Sei C ranges::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>, dann ist bool(t == u) == bool(C(t) == C(u)).

[bearbeiten] Gleichheitserhaltung

Ein Ausdruck ist gleichheitserhaltend, wenn er bei gleichen Eingaben gleiche Ausgaben liefert.

  • Die Eingaben für einen Ausdruck bestehen aus seinen Operanden.
  • Die Ausgaben eines Ausdrucks bestehen aus seinem Ergebnis und allen von dem Ausdruck modifizierten Operanden (falls vorhanden).

Jeder Ausdruck, der gleichheitserhaltend sein muss, muss außerdem stabil sein: Zwei Auswertungen eines solchen Ausdrucks mit denselben Eingabeobjekten müssen gleiche Ausgaben liefern, solange keine explizite zwischenzeitliche Modifikation dieser Eingabeobjekte erfolgt.

[bearbeiten] Implizite Ausdrucksvariationen

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, es sei denn, eine solche Ausdrucksvariation ist explizit mit abweichender Semantik erforderlich. Diese impliziten Ausdrucksvariationen müssen die gleichen semantischen Anforderungen des deklarierten Ausdrucks erfüllen. Das Ausmaß, in dem eine Implementierung die Syntax der Variationen validiert, ist nicht spezifiziert.