Namensräume
Varianten
Aktionen

std::compare_weak_order_fallback

Von cppreference.com
< cpp‎ | utility
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
compare_weak_order_fallback
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
Definiert in der Header-Datei <compare>
inline namespace /* nicht spezifiziert */ {

    inline constexpr /* nicht spezifiziert */
        compare_weak_order_fallback = /* nicht spezifiziert */;

}
(seit C++20)
Aufruf-Signatur
template< class T, class U >

    requires /* siehe unten */
constexpr std::weak_ordering

    compare_weak_order_fallback( T&& t, U&& u ) noexcept(/* siehe unten */);
(seit C++20)

Führt einen Drei-Wege-Vergleich für die Teilausdrücke t und u durch und erzeugt ein Ergebnis vom Typ std::weak_ordering, auch wenn der Operator <=> nicht verfügbar ist.

Wenn std::decay_t<T> und std::decay_t<U> denselben Typ haben, ist std::compare_weak_order_fallback(t, u) ausdrucksäquivalent zu

  • std::weak_order(t, u), wenn dies ein wohlgeformter Ausdruck ist; andernfalls
  • t == u ? std::weak_ordering::equivalent :
    t <  u ? std::weak_ordering::less :
             std::weak_ordering::greater
    , wenn die Ausdrücke t == u und t < u beide wohlgeformt sind und jeweils decltype(t == u) und decltype(t < u) boolean-testable modellieren, außer dass t und u nur einmal ausgewertet werden.

In allen anderen Fällen ist std::compare_weak_order_fallback(t, u) schlecht geformt, was zu einem Substitutionsfehler führen kann, wenn er im unmittelbaren Kontext einer Templatinstanziierung auftritt.

Inhalt

Customization Point Objects

Der Name std::compare_weak_order_fallback bezeichnet ein Customization Point Object, ein konstantes Funktionsobjekt eines literalen semiregular Klassentyps. Zu Auslegungszwecken wird die cv-unqualifizierte Version seines Typs als __compare_weak_order_fallback_fn bezeichnet.

Alle Instanzen von __compare_weak_order_fallback_fn sind gleich. Die Auswirkungen des Aufrufs verschiedener Instanzen des Typs __compare_weak_order_fallback_fn mit denselben Argumenten sind äquivalent, unabhängig davon, ob der den Instanz bezeichnende Ausdruck ein lvalue oder ein rvalue ist und ob er mit const qualifiziert ist oder nicht (eine mit volatile qualifizierte Instanz muss jedoch nicht aufrufbar sein). Daher kann std::compare_weak_order_fallback frei kopiert werden und seine Kopien können austauschbar verwendet werden.

Gegeben sei eine Menge von Typen Args.... Wenn std::declval<Args>()... die Anforderungen für Argumente an std::compare_weak_order_fallback oben erfüllt, modelliert __compare_weak_order_fallback_fn

Andernfalls nimmt kein Funktionsoperator von __compare_weak_order_fallback_fn an der Überladungsauflösung teil.

[bearbeiten] Beispiel

#include <compare>
#include <iostream>
 
// does not support <=>
struct Rational_1
{
    int num;
    int den; // > 0
};
 
inline constexpr bool operator<(Rational_1 lhs, Rational_1 rhs)
{
    return lhs.num * rhs.den < rhs.num * lhs.den;
}
 
inline constexpr bool operator==(Rational_1 lhs, Rational_1 rhs)
{
    return lhs.num * rhs.den == rhs.num * lhs.den;
}
 
// supports <=>
struct Rational_2
{
    int num;
    int den; // > 0
};
 
inline constexpr std::weak_ordering operator<=>(Rational_2 lhs, Rational_2 rhs)
{
    return lhs.num * rhs.den <=> rhs.num * lhs.den;
}
 
inline constexpr bool operator==(Rational_2 lhs, Rational_2 rhs)
{
    return lhs <=> rhs == 0;
}
 
void print(int id, std::weak_ordering value)
{
    std::cout << id << ") ";
    if (value == 0)
        std::cout << "equal\n";
    else if (value < 0)
        std::cout << "less\n";
    else
        std::cout << "greater\n";
}
 
int main()
{
    Rational_1 a{1, 2}, b{3, 4};
//  print(0, a <=> b); // does not work
    print(1, std::compare_weak_order_fallback(a, b)); // works, defaults to < and ==
 
    Rational_2 c{6, 5}, d{8, 7};
    print(2, c <=> d); // works
    print(3, std::compare_weak_order_fallback(c, d)); // works
 
    Rational_2 e{2, 3}, f{4, 6};
    print(4, e <=> f); // works
    print(5, std::compare_weak_order_fallback(e, f)); // works
}

Ausgabe

1) less
2) greater
3) greater
4) equal
5) equal

[bearbeiten] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2114
(P2167R3)
C++20 der Fallback-Mechanismus erforderte nur
Rückgabetypen konvertierbar zu bool waren
Einschränkungen verstärkt

[bearbeiten] Siehe auch

führt einen 3-Wege-Vergleich durch und erzeugt ein Ergebnis vom Typ std::weak_ordering
(Customization Point Objekt)[edit]