Namespaces
Variants

std::equality_comparable, std::equality_comparable_with

Von de.cppreference.net
 
 
 
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*)
1) Das Konzept std::equality_comparable legt fest, dass die Vergleichsoperatoren == und != auf T die Gleichheit widerspiegeln: == ergibt true genau dann, wenn die Operanden gleich sind.
2) Das Konzept 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.
3) Das nur zur Veranschaulichung dienende Konzept __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.
4) Das nur zur Veranschaulichung dienende Konzept __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)
  • static_cast < const C & > ( std:: as_const ( E ) ) falls dies ein gültiger Ausdruck ist,
  • static_cast < const C & > ( std :: move ( E ) ) andernfalls.
(seit C++23)
1) std :: equality_comparable < T > wird nur dann modelliert, 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 zu mindestens einem anderen Objekt gleich sind.
2) std :: equality_comparable_with < T, U > wird nur modelliert, wenn, seien

der folgende Ausdruck wahr ist:

  • bool ( t == u ) == bool ( CONVERT_TO < C > ( t2 ) == CONVERT_TO < C > ( u2 ) ) .
3) __WeaklyEqualityComparableWith < T, U > wird nur modelliert, wenn gegeben

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 ) .
4) __WeaklyEqualityComparableWith < T, U > wird nur modelliert, wenn:

Das entsprechende common_reference_with -Konzept modelliert wird.

(bis C++23)

Seien

dann gelten folgende Bedingungen:

  • CONVERT_TO < C > ( t1 ) gleich CONVERT_TO < C > ( t2 ) genau dann, wenn t1 gleich t2 ist; und
  • CONVERT_TO < C > ( u1 ) gleich CONVERT_TO < C > ( u2 ) genau dann, wenn u1 gleich u2 ist.
(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]
  • C++20-Standard (ISO/IEC 14882:2020):
  • 18.5.3 Konzept equality_comparable [concept.equalitycomparable]