Namensräume
Varianten
Aktionen

std::equality_comparable, std::equality_comparable_with

Von cppreference.com
< cpp‎ | concepts
 
 
 
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 =
    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 >

Konzept __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 Exposition*)
(4)
template< class T, class U >

Konzept __ComparisonCommonTypeWith =
    std::common_reference_with<
        const std::remove_reference_t<T>&,

        const std::remove_reference_t<U>&>;
(bis C++23)
(nur Exposition*)
template< class T, class U, class C = std::common_reference_t<const T&, const U&> >

Konzept _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 >
Konzept __ComparisonCommonTypeWith =

    _ComparisonCommonTypeWithImpl<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
(seit C++23)
(nur Exposition*)
1) Das Konzept std::equality_comparable spezifiziert, 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 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.
3) Das exposition-only-Konzept __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.
4) Das exposition-only-Konzept __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)
  • 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 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 == für alle Objekte a, die zu mindestens einem anderen Objekt gleich sind, reflexiv ist.
2) std::equality_comparable_with<T, U> wird nur modelliert, wenn Folgendes gilt:

ist der folgende Ausdruck wahr

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

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

Das entsprechende common_reference_with-Konzept modelliert wird.

(bis C++23)

Seien

gelten die folgenden Bedingungen

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