Namespaces
Variants

Comparison operators

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Vergleicht die Argumente.

Operatorname Syntax Über lade bar Prototypbeispiele (für class T )
Innerhalb der Klassendefinition Außerhalb der Klassendefinition
Gleich a == b Ja bool T :: operator == ( const U & b ) const ; bool operator == ( const T & a, const U & b ) ;
Ungleich a != b Ja bool T :: operator ! = ( const U & b ) const ; bool operator ! = ( const T & a, const U & b ) ;
Kleiner als a < b Ja bool T :: operator < ( const U & b ) const ; bool operator < ( const T & a, const U & b ) ;
Größer als a > b Ja bool T :: operator > ( const U & b ) const ; bool operator > ( const T & a, const U & b ) ;
Kleiner als oder gleich a <= b Ja bool T :: operator <= ( const U & b ) const ; bool operator <= ( const T & a, const U & b ) ;
Größer als oder gleich a >= b Ja bool T :: operator >= ( const U & b ) const ; bool operator >= ( const T & a, const U & b ) ;
Drei-Wege-Vergleich (C++20) a <=> b Ja R T :: operator <=> ( const U & b ) const ; [1] R operator <=> ( const T & a, const U & b ) ; [1]
Hinweise
  • Wo eingebaute Operatoren bool zurückgeben, geben die meisten benutzerdefinierten Überladungen ebenfalls bool zurück, damit die benutzerdefinierten Operatoren auf die gleiche Weise wie die eingebauten verwendet werden können. In einer benutzerdefinierten Operatorüberladung kann jedoch jeder Typ als Rückgabetyp verwendet werden (einschließlich void ).
  • U kann jeder Typ einschließlich T sein.
  1. 1.0 1.1 R ist der Rückgabetyp von operator<=> ( siehe unten )

Inhaltsverzeichnis

Zweiseitiger Vergleich

Der Zwei-Wege-Vergleichsoperator-Ausdruck hat die Form

Relationsoperatoren
lhs < rhs (1)
lhs > rhs (2)
lhs <= rhs (3)
lhs >= rhs (4)
**Hinweis:** Da der Text innerhalb der ` ` Tags C++-spezifische Begriffe (`lhs` und `rhs`) enthält und gemäß den Anweisungen nicht übersetzt werden soll, sowie der gesamte Code in den ` ` Tags erhalten bleiben muss, wurde keine Übersetzung vorgenommen. Die numerischen Bezeichnungen (1)-(4) wurden ebenfalls beibehalten, da es sich um technische Referenzen handelt.
Gleichheitsoperatoren
lhs == rhs (5)
lhs != rhs (6)
1) Gibt true zurück, wenn lhs kleiner als rhs ist, andernfalls false .
2) Gibt true zurück, falls lhs größer als rhs ist, andernfalls false .
3) Gibt true zurück, falls lhs kleiner oder gleich rhs ist, andernfalls false .
4) Gibt true zurück, falls lhs größer oder gleich rhs ist, andernfalls false .
5) Gibt true zurück, falls lhs gleich rhs ist, andernfalls false .
6) Gibt true zurück, falls lhs ungleich rhs ist, andernfalls false .

Eingebaute bidirektionale Vergleichsoperatoren

Für eingebaute zweistellige Vergleichsoperatoren werden Lvalue-zu-Rvalue-Konvertierungen , Array-zu-Zeiger-Konvertierungen (bis C++26) und Funktions-zu-Zeiger-Konvertierungen auf lhs und rhs angewendet.

Der Vergleich ist veraltet, wenn sowohl lhs als auch rhs vor Anwendung dieser Konvertierungen Array-Typ haben.

(since C++20)
(until C++26)

Für eingebaute relationale Operatoren wird, wenn einer der Operanden ein Zeiger ist, die Array-zu-Zeiger-Konvertierung auf den anderen Operanden angewendet.

Für eingebaute Gleichheitsoperatoren wird, wenn einer der Operanden ein Zeiger oder eine Nullzeigerkonstante ist, die Array-zu-Zeiger-Konvertierung auf den anderen Operanden angewendet.

(since C++26)

Für eingebaute Zwei-Wege-Vergleichsoperatoren ist das Ergebnis ein bool Prvalue.

Eingebaute arithmetische Vergleichsoperationen

Wenn die konvertierten Operanden beide arithmetischen oder Enumerationstyp (scoped oder unscoped) haben, usual arithmetic conversions werden auf beide Operanden angewendet. Die Werte werden nach den Konvertierungen verglichen:

#include <iostream>
int main()
{
    static_assert(sizeof(unsigned char) < sizeof(int),
                  "Cannot compare signed and smaller unsigned properly");
    int a = -1;
    int b = 1;
    unsigned int c = 1;
    unsigned char d = 1;
    std::cout << std::boolalpha
              << "Comparing two signed values:\n"
                 " -1 == 1 ? " << (a == b) << "\n"
                 " -1 <  1 ? " << (a <  b) << "\n"
                 " -1 >  1 ? " << (a >  b) << "\n"
                 "Comparing signed and unsigned:\n"
                 // may issue different-signedness warning:
                 " -1 == 1 ? " << (a == c) << "\n"
                 // may issue different-signedness warning:
                 " -1 <  1 ? " << (a <  c) << "\n"
                 // may issue different-signedness warning:
                 " -1 >  1 ? " << (a >  c) << "\n"
                 "Comparing signed and smaller unsigned:\n"
                 " -1 == 1 ? " << (a == d) << "\n"
                 " -1 <  1 ? " << (a <  d) << "\n"
                 " -1 >  1 ? " << (a >  d) << '\n';
}

Ausgabe:

Comparing two signed values:
 -1 == 1 ? false
 -1 <  1 ? true
 -1 >  1 ? false
Comparing signed and unsigned:
 -1 == 1 ? false
 -1 <  1 ? false
 -1 >  1 ? true
Comparing signed and smaller unsigned:
 -1 == 1 ? false
 -1 <  1 ? true
 -1 >  1 ? false
**Übersetzungsdetails:** - "Run this code" → "Diesen Code ausführen" - "Output:" → "Ausgabe:" - HTML-Tags, Attribute und Code-Blöcke wurden unverändert beibehalten - C++-spezifische Begriffe wurden nicht übersetzt - Formatierung und Struktur wurden originalgetreu erhalten

Eingebaute Zeigergleichheitsvergleiche

Die konvertierten Operanden der Gleichheitsoperatoren == und != können ebenfalls den Typ std::nullptr_t haben, (seit C++11) Zeigertyp oder Zeiger-auf-Member-Typ sein.

Eingebaute Zeigergleichheitsvergleiche haben drei mögliche Ergebnisse: gleich, ungleich und nicht spezifiziert. Die von Gleichheitsoperatoren für eingebaute Zeigergleichheitsvergleiche gelieferten Werte sind unten aufgeführt:

Vergleichsergebnis
von p und q
Gelieferter Wert durch
p == q p ! = q
gleich true false
ungleich false true
nicht spezifiziert nicht spezifizierter bool Wert

Wenn mindestens einer der konvertierten lhs und rhs ein Zeiger ist, werden Zeigerkonvertierungen , Funktionszeigerkonvertierungen (seit C++17) und Qualifikationskonvertierungen auf beiden konvertierten Operanden durchgeführt, um sie auf ihren zusammengesetzten Zeigertyp zu bringen. Die beiden Zeiger des zusammengesetzten Zeigertyps werden wie folgt verglichen:

  • Wenn ein Zeiger die Adresse eines vollständigen Objekts repräsentiert und ein anderer Zeiger
  • repräsentiert die Adresse nach dem Ende eines anderen vollständigen Nicht-Array-Objekts, oder
  • repräsentiert die Adresse eins nach dem letzten Element eines anderen vollständigen Array-Objekts,
das Ergebnis des Vergleichs ist nicht spezifiziert.
  • Andernfalls, wenn die Zeiger beide null sind, beide auf dieselbe Funktion zeigen oder beide dieselbe Adresse repräsentieren (d.h. sie zeigen auf dasselbe Objekt oder sind hinter dessen Ende), vergleichen sie gleich.
  • Andernfalls vergleichen die Zeiger ungleich.

Wenn mindestens einer der konvertierten lhs und rhs ein Zeiger auf Member ist, werden Pointer-to-Member-Konvertierungen , Function-Pointer-Konvertierungen (seit C++17) und Qualification-Konvertierungen auf beiden konvertierten Operanden durchgeführt, um sie auf ihren zusammengesetzten Zeigertyp zu bringen. Die beiden Zeiger auf Member des zusammengesetzten Zeigertyps werden wie folgt verglichen:

  • Wenn zwei Zeiger auf Member beide den Null-Member-Zeigerwert haben, vergleichen sie gleich.
  • Wenn nur einer von zwei Zeigern auf Member den Null-Member-Zeigerwert hat, vergleichen sie ungleich.
  • Wenn einer von beiden ein Zeiger auf eine virtuelle Memberfunktion ist, ist das Ergebnis nicht spezifiziert.
  • Wenn sich einer auf ein Member der Klasse C1 bezieht und der andere auf ein Member einer anderen Klasse C2 , wobei keine eine Basisklasse der anderen ist, ist das Ergebnis nicht spezifiziert.
  • Wenn sich beide auf (möglicherweise verschiedene) Member derselben Union beziehen, vergleichen sie gleich.
  • Andernfalls vergleichen zwei Zeiger auf Member gleich, wenn sie auf dasselbe Member desselben am meisten abgeleiteten Objekts oder desselben Unterobjekts verweisen würden, wenn eine Indirektion mit einem hypothetischen Objekt des zugehörigen Klassentyps durchgeführt würde, andernfalls vergleichen sie ungleich.
struct P {};
struct Q : P { int x; };
struct R : P { int x; };
int P::*bx = (int(P::*)) &Q::x;
int P::*cx = (int(P::*)) &R::x;
bool b1 = (bx == cx); // nicht spezifiziert
struct B
{
    int f();
};
struct L : B {};
struct R : B {};
struct D : L, R {};
int (B::*pb)() = &B::f;
int (L::*pl)() = pb;
int (R::*pr)() = pb;
int (D::*pdl)() = pl;
int (D::*pdr)() = pr;
bool x = (pdl == pdr); // falsch
bool y = (pb == pl);   // wahr

Zwei Operanden vom Typ std::nullptr_t oder ein Operand vom Typ std::nullptr_t und der andere eine Nullzeigerkonstante vergleichen gleich.

(since C++11)

Eingebaute relationale Zeigervergleiche

Die konvertierten Operanden von relationalen Operatoren > , < , >= und <= können ebenfalls Pointer-Typ haben.

Eingebaute relationale Zeigervergleiche bei ungleichen Zeigern p und q haben drei mögliche Ergebnisse: p ist größer, q ist größer und unspezifiziert. Die Werte, die von relationalen Operatoren für eingebaute relationale Zeigervergleiche geliefert werden, sind unten aufgeführt:

Vergleichsergebnis
von p und q
Wert geliefert durch
p > q p < q p >= q p <= q
gleich false false true true
p ist größer true false true false
q ist größer false true false true
nicht spezifiziert nicht spezifizierter bool -Wert

Wenn der konvertierte lhs und rhs beide Zeiger sind, Zeigerkonvertierungen , Funktionszeigerkonvertierungen (seit C++17) und Qualifikationskonvertierungen werden auf beiden konvertierten Operanden durchgeführt, um sie auf ihren zusammengesetzten Zeigertyp zu bringen. Die beiden Zeiger des zusammengesetzten Zeigertyps werden wie folgt verglichen:

  • Wenn die Zeiger gleich verglichen werden oder das Ergebnis des Gleichheitsvergleichs nicht spezifiziert ist, fällt das Ergebnis des relationalen Vergleichs in dieselbe Kategorie.
  • Andernfalls (wenn die Zeiger ungleich verglichen werden), falls einer der Zeiger kein Zeiger auf ein Objekt ist, ist das Ergebnis nicht spezifiziert.
  • Andernfalls (beide Zeiger zeigen auf Objekte), wird das Ergebnis definiert durch eine partielle Ordnung, die mit den folgenden Regeln konsistent ist:
  • Gegeben zwei verschiedene Elemente high und low eines Arrays, wobei high einen höheren Index als low hat: Wenn ein Zeiger auf high (oder ein Unterobjekt von high ) zeigt und der andere Zeiger auf low (oder ein Unterobjekt von low ) zeigt, dann vergleicht sich der erstere als größer als der letztere.
  • Wenn ein Zeiger auf ein Element elem (oder auf ein Unterobjekt von elem ) eines Arrays zeigt und der andere Zeiger über das Ende desselben Arrays hinauszeigt, dann vergleicht sich der Zeiger über das Ende hinaus als größer als der andere Zeiger.
  • Wenn ein Zeiger auf ein vollständiges Objekt, ein Basisklassen-Unterobjekt oder ein Mitglieds-Unterobjekt obj (oder auf ein Unterobjekt von obj ) zeigt und der andere Zeiger über das Ende von obj hinauszeigt, dann vergleicht sich der Zeiger über das Ende hinaus als größer als der andere Zeiger.

  • Wenn die Zeiger auf verschiedene nicht-null-große (seit C++20) nicht-statische Datenelemente mit demselben Elementzugriff (bis C++23) desselben Objekts eines Nicht-Union-Klassentyps zeigen, oder auf Unterobjekte solcher Elemente, rekursiv, dann vergleicht sich der Zeiger auf das später deklarierte Element größer als der andere Zeiger.
  • Andernfalls ist das Ergebnis nicht spezifiziert.

Zeiger-Gesamtordnung

Es existiert eine implementierungsdefinierte strikte Totalordnung über Zeiger in jedem Programm. Die strikte Totalordnung ist konsistent mit der oben beschriebenen partiellen Ordnung: unspezifizierte Ergebnisse werden implementierungsdefiniert, während andere Ergebnisse gleich bleiben.

Zeigervergleich mit der strikten Totalordnung wird in den folgenden Fällen angewendet:

(seit C++14)
(seit C++20)

Überladungen

Bei Überlagerungsauflösung für benutzerdefinierte Operatoren nehmen für jedes Paar von heraufgestuften arithmetischen Typen L und R , einschließlich Aufzählungstypen, die folgenden Funktionssignaturen an der Überlagerungsauflösung teil:

bool operator < ( L, R ) ;
bool operator > ( L, R ) ;
bool operator <= ( L, R ) ;
bool operator >= ( L, R ) ;
bool operator == ( L, R ) ;
bool operator ! = ( L, R ) ;

Für jeden Typ P , der entweder ein Zeiger auf Objekt oder ein Zeiger auf Funktion ist, nehmen die folgenden Funktionssignaturen an der Überladungsauflösung teil:

bool operator < ( P, P ) ;
bool operator > ( P, P ) ;
bool operator <= ( P, P ) ;
bool operator >= ( P, P ) ;
bool operator == ( P, P ) ;
bool operator ! = ( P, P ) ;
**Anmerkung:** Da der gesamte Inhalt innerhalb von ` ` Tags liegt (was als Code-ähnliche Umgebung betrachtet werden kann) und gemäß den Anweisungen keine C++-spezifischen Begriffe übersetzt werden sollen, bleibt der gesamte Code unverändert. Die HTML-Struktur und Formatierung wurden vollständig beibehalten.

Für jeden Typ MP , der ein Zeiger auf Mitgliedsobjekt oder Zeiger auf Mitgliedsfunktion ist oder std::nullptr_t (seit C++11) , nehmen die folgenden Funktionssignaturen an der Überladungsauflösung teil:

bool operator == ( MP, MP ) ;
bool operator ! = ( MP, MP ) ;
#include <iostream>
struct Foo
{
    int n1;
    int n2;
};
union Union
{
    int n;
    double d;
};
int main()
{
    std::cout << std::boolalpha;
    char a[4] = "abc";
    char* p1 = &a[1];
    char* p2 = &a[2];
    std::cout << "Pointers to array elements:\n"
              << "p1 == p2? " << (p1 == p2) << '\n'
              << "p1 <  p2? " << (p1 <  p2) << '\n';
    Foo f;
    int* p3 = &f.n1;
    int* p4 = &f.n2;
    std::cout << "Pointers to members of a class:\n"
              << "p3 == p4? " << (p3 == p4) << '\n'
              << "p3 <  p4? " << (p3 <  p4) << '\n';
    Union u;
    int* p5 = &u.n;
    double* p6 = &u.d;
    std::cout << "Pointers to members of a union:\n"
              << "p5 == (void*)p6? " << (p5 == (void*)p6) << '\n'
              << "p5 <  (void*)p6? " << (p5 <  (void*)p6) << '\n';
}

Ausgabe:

Pointers to array elements:
p1 == p2? false
p1 <  p2? true
Pointers to members of a class:
p3 == p4? false
p3 <  p4? true
Pointers to members of a union:
p5 == (void*)p6? true
p5 <  (void*)p6? false

Dreifachvergleich

Der Drei-Wege-Vergleichsoperator-Ausdruck hat die Form

a <=> b

Der Ausdruck gibt ein Objekt zurück, sodass

  • ( a <=> b ) < 0 falls a < b ,
  • ( a <=> b ) > 0 falls a > b ,
  • ( a <=> b ) == 0 falls a und b gleich/äquivalent sind.

Wenn einer der Operanden vom Typ bool ist und der andere nicht, ist das Programm fehlerhaft.

Wenn beide Operanden arithmetische Typen haben oder wenn ein Operand einen unbegrenzten Aufzählungstyp und der andere einen ganzzahligen Typ hat, werden die üblichen arithmetischen Konvertierungen auf die Operanden angewendet, und dann

  • Wenn eine einschränkende Konvertierung erforderlich ist, außer von einem integralen Typ zu einem Gleitkommatyp, ist das Programm fehlerhaft.
  • Andernfalls, wenn die Operanden integralen Typ haben, liefert der Operator einen Prvalue vom Typ std::strong_ordering :
  • std::strong_ordering::equal wenn beide Operanden arithmetisch gleich sind,
  • std::strong_ordering::less wenn der erste Operand arithmetisch kleiner als der zweite ist,
  • std::strong_ordering::greater andernfalls.
  • Andernfalls haben die Operanden Gleitkommatyp, und der Operator ergibt einen Prvalue vom Typ std::partial_ordering . Der Ausdruck a <=> b ergibt
  • std::partial_ordering::less wenn a kleiner als b ist,
  • std::partial_ordering::greater wenn a größer als b ist,
  • std::partial_ordering::equivalent wenn a äquivalent zu b ist ( - 0 <=> + 0 ist äquivalent),
  • std::partial_ordering::unordered ( NaN <=> anything ist ungeordnet).

Wenn beide Operanden denselben Enumerationstyp E haben, liefert der Operator das Ergebnis der Konvertierung der Operanden in den zugrunde liegenden Typ von E und der Anwendung von <=> auf die konvertierten Operanden.

Wenn mindestens einer der Operanden ein Zeiger auf Objekt oder Zeiger auf Member ist, Array-zu-Zeiger-Konvertierungen , Zeigerkonvertierungen und Qualifikationskonvertierungen werden auf beide Operanden angewendet, um sie auf ihren zusammengesetzten Zeigertyp zu bringen.

Für konvertierte Pointer-Operanden p und q gibt p <=> q einen prvalue vom Typ std::strong_ordering zurück:

  • std::strong_ordering::equal wenn sie gleich vergleichen ,
  • std::strong_ordering::less wenn q größer als p vergleicht,
  • std::strong_ordering::greater wenn p größer als q vergleicht,
  • nicht spezifiziertes Ergebnis, wenn das Zwei-Wege-Vergleichsergebnis nicht spezifiziert ist.

Andernfalls ist das Programm fehlerhaft.

Überladungen

Bei Überlagerungsauflösung gegenüber benutzerdefinierten Operatoren , für Zeiger- oder Aufzählungstyp T , nimmt die folgende Funktionssignatur an der Überlagerungsauflösung teil:

R operator <=> ( T, T ) ;

Wo R der oben definierte Ordnungskategorietyp ist.

#include <compare>
#include <iostream>
int main()
{
    double foo = -0.0;
    double bar = 0.0;
    auto res = foo <=> bar;
    if (res < 0)
        std::cout << "-0 is less than 0";
    else if (res > 0)
        std::cout << "-0 is greater than 0";
    else if (res == 0)
        std::cout << "-0 and 0 are equal";
    else
        std::cout << "-0 and 0 are unordered";
}

Ausgabe:

-0 and 0 are equal
(seit C++20)

Hinweise

Da Vergleichsoperatoren von links nach rechts gruppieren, wird der Ausdruck a < b < c als ( a < b ) < c geparst und nicht als a < ( b < c ) oder ( a < b ) && ( b < c ) .

#include <iostream>
int main()
{
    int a = 3, b = 2, c = 1;
    std::cout << std::boolalpha
        << (a < b < c) << '\n' // true; möglicherweise Warnung
        << ((a < b) < c) << '\n' // true
        << (a < (b < c)) << '\n' // false
        << ((a < b) && (b < c)) << '\n'; // false
}

Eine häufige Anforderung für user-defined operator< ist strict weak ordering . Insbesondere wird dies von den Standardalgorithmen und Containern benötigt, die mit Compare -Typen arbeiten: std::sort , std::max_element , std::map , etc.

Das Vergleichsergebnis von Zeigern auf verschiedene nicht-statische Datenelemente derselben Klasse impliziert, dass nicht-statische Datenelemente in jedem der drei Zugriffsmodi für Elemente (bis C++23) im Speicher in der Reihenfolge ihrer Deklaration positioniert sind.

Obwohl das Ergebnis des Vergleichs von Zeigern beliebigen Ursprungs (z.B. nicht alle zeigen auf Elemente desselben Arrays) nicht spezifiziert ist, bieten viele Implementierungen eine strenge Totalordnung von Zeigern, z.B. wenn sie als Adressen innerhalb eines kontinuierlichen virtuellen Adressraums implementiert sind. Jene Implementierungen, die dies nicht tun (z.B. wenn nicht alle Bits des Zeigers Teil einer Speicheradresse sind und für den Vergleich ignoriert werden müssen, oder eine zusätzliche Berechnung erforderlich ist oder sonst Zeiger und Integer keine 1-zu-1-Beziehung haben), bieten eine Spezialisierung von std::less für Zeiger an, die diese Garantie bietet. Dies ermöglicht es, alle Zeiger beliebigen Ursprungs als Schlüssel in standardmäßigen assoziativen Containern wie std::set oder std::map zu verwenden.

Für Typen, die sowohl EqualityComparable als auch LessThanComparable sind, trifft die C++-Standardbibliothek eine Unterscheidung zwischen Gleichheit , die durch den Wert des Ausdrucks a == b definiert ist, und Äquivalenz , die durch den Wert des Ausdrucks ! ( a < b ) && ! ( b < a ) definiert ist.

Der Vergleich zwischen Zeigern und Nullzeigerkonstanten wurde durch die Lösung von CWG Issue 583 entfernt, die in N3624 enthalten ist:

void f(char* p)
{
    if (p > 0) { /*...*/ } // Fehler mit N3624, kompilierte vor N3624
    if (p > nullptr) { /*...*/ } // Fehler mit N3624, kompilierte vor N3624
}
int main() {}

Der dreiseitige Vergleich kann automatisch für Klassentypen generiert werden, siehe default comparisons .

Wenn beide Operanden Arrays sind, ist der Drei-Wege-Vergleich fehlerhaft.

unsigned int i = 1;
auto r = -1 < i;    // Bestehende Fehlerquelle: gibt 'false' zurück
auto r2 = -1 <=> i; // Fehler: Einschränkende Konvertierung erforderlich
Feature-Test Makro Wert Std Feature
__cpp_impl_three_way_comparison 201907L (C++20) Drei-Wege-Vergleich (Compiler-Unterstützung)
__cpp_lib_three_way_comparison 201907L (C++20) Drei-Wege-Vergleich (Bibliotheksunterstützung); Hinzufügen des Drei-Wege-Vergleichs zur Bibliothek

Standardbibliothek

Vergleichsoperatoren sind für viele Klassen in der Standardbibliothek überladen.

**Übersetzungsdetails:** - "compares two time points" → "vergleicht zwei Zeitpunkte" - "function template" → "Funktions-Template" - "removed in C++20" → "entfernt in C++20" - Alle HTML-Tags, Attribute und C++-spezifischen Begriffe (wie operator-Namen und C++-Versionsangaben) wurden unverändert beibehalten - Die ursprüngliche Formatierung wurde vollständig erhalten **Änderungen:** - `compares the internal states of two pseudo-random number engines` → `vergleicht die internen Zustände zweier Pseudozufallszahlengeneratoren` - `(function)` → `(Funktion)` - `(removed in C++20)` → `(entfernt in C++20)` **Beibehalten:** - Alle HTML-Tags und Attribute - C++-spezifische Begriffe (`operator==`, `operator!=`, `C++11`, `C++20`) - Code-Formatierung und Struktur
(removed in C++20)
prüft, ob die Objekte auf denselben Typ verweisen
(öffentliche Elementfunktion von std::type_info )
(entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht zwei error_code s
(Funktion)
(entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht error_condition s und error_code s
(Funktion)
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht die Werte im pair lexikographisch
(Funktions-Template)
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht die Werte im Tupel lexikographisch
(Funktions-Template)
(entfernt in C++20)
vergleicht die Inhalte
(öffentliche Elementfunktion von std::bitset<N> )
(entfernt in C++20)
vergleicht zwei Allokator-Instanzen
(öffentliche Mitgliedsfunktion von std::allocator<T> )
vergleicht mit einem anderen unique_ptr oder mit nullptr
(Funktionsschablone)
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht mit einem anderen shared_ptr oder mit nullptr
(Funktions-Template)
(entfernt in C++20)
vergleicht ein std::function mit nullptr
(Funktions-Template)
(C++11) (C++11) (entfernt in C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
vergleicht zwei Dauern
(Funktions-Template)
(C++11) (C++11) (entfernt in C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
vergleicht zwei Zeitpunkte
(Funktions-Template)
(entfernt in C++20)
vergleicht zwei scoped_allocator_adaptor Objekte
(Funktions-Template)
vergleicht die zugrundeliegenden std::type_index Objekte
(öffentliche Elementfunktion von std::type_index )
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht zwei Zeichenketten lexikographisch
(Funktionsschablone)
(entfernt in C++20)
Gleichheitsvergleich zwischen Locale-Objekten
(öffentliche Elementfunktion von std::locale )
(C++11) (C++11) (entfernt in C++20) (C++11) (entfernt in C++20) (C++11) (entfernt in C++20) (C++11) (entfernt in C++20) (C++11) (entfernt in C++20) (C++20)
vergleicht zwei array -Werte lexikographisch
(Funktionstemplate)
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht die Werte von zwei deque s lexikographisch
(Funktions-Template)
(C++11) (C++11) (entfernt in C++20) (C++11) (entfernt in C++20) (C++11) (entfernt in C++20) (C++11) (entfernt in C++20) (C++11) (entfernt in C++20) (C++20)
vergleicht lexikographisch die Werte von zwei forward_list s
(Funktions-Template)
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht lexikographisch die Werte von zwei list s
(Funktions-Template)
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht die Werte von zwei vector s lexikographisch
(Funktions-Template)
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht die Werte von zwei map s lexikographisch
(Funktions-Template)
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht die Werte von zwei multimap s lexikographisch
(Funktions-Template)
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht die Werte von zwei set s lexikographisch
(Funktions-Template)
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht die Werte von zwei multiset s lexikographisch
(Funktions-Template)
(C++11) (C++11) (entfernt in C++20)
vergleicht die Werte in der unordered_map
(Funktions-Template)
(C++11) (C++11) (entfernt in C++20)
vergleicht die Werte im unordered_multimap
(Funktions-Template)
(C++11) (C++11) (removed in C++20)
vergleicht die Werte im unordered_set
(Funktions-Template)
(C++11) (C++11) (entfernt in C++20)
vergleicht die Werte im unordered_multiset
(Funktions-Template)
vergleicht lexikographisch die Werte von zwei queue s
(Funktions-Template)
vergleicht die Werte von zwei stack s lexikographisch
(Funktions-Template)
vergleicht die zugrundeliegenden Iteratoren
(Funktions-Template)
(C++11) (C++11) (entfernt in C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
vergleicht die zugrundeliegenden Iteratoren
(Funktions-Template)
(entfernt in C++20)
vergleicht zwei istream_iterator s
(Funktions-Template)
(entfernt in C++20)
vergleicht zwei istreambuf_iterator s
(Funktions-Template)
(removed in C++20)
vergleicht zwei komplexe Zahlen oder eine komplexe Zahl und einen Skalar
(Funktions-Template)
vergleicht zwei valarrays oder ein valarray mit einem Wert
(Funktions-Template)
(C++11) (C++11) (entfernt in C++20)
vergleicht die internen Zustände zweier Pseudozufallszahlengeneratoren
(Funktion)
(C++11) (C++11) (entfernt in C++20)
vergleicht zwei Verteilungsobjekte
(Funktion)
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht einen sub_match mit einem anderen sub_match , einer Zeichenkette oder einem Zeichen
(Funktions-Template)
(entfernt in C++20)
vergleicht die Werte in den beiden Übereinstimmungsergebnissen lexikographisch
(Funktionsschablone)
(entfernt in C++20)
vergleicht zwei regex_iterator s
(öffentliche Mitgliedsfunktion von std::regex_iterator<BidirIt,CharT,Traits> )
(entfernt in C++20)
vergleicht zwei regex_token_iterator s
(öffentliche Mitgliedsfunktion von std::regex_token_iterator<BidirIt,CharT,Traits> )
(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht zwei thread::id Objekte
(Funktion)

Der Namensraum std::rel_ops stellt generische Operatoren ! = , > , <= und >= bereit:

Definiert im Header <utility>
Definiert im Namensraum std::rel_ops
generiert automatisch Vergleichsoperatoren basierend auf benutzerdefiniertem operator == und operator <
(Funktions-Template)

Fehlerberichte

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

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 583
( N3624 )
C++98 alle sechs Vergleichsoperatoren konnten verwendet werden, um
einen Zeiger mit einer Nullzeigerkonstante zu vergleichen
nur Gleichheitsoperatoren
sind erlaubt
CWG 661 C++98 die tatsächliche Semantik arithmetischer Vergleiche (z.B.
ob 1 < 2 zu true oder false führt) war nicht spezifiziert
Spezifikation hinzugefügt
CWG 879 C++98 Zeiger auf Funktionstypen und Zeiger
auf void hatten keine eingebauten Vergleiche
Vergleichsspezifikation
für diese Zeiger hinzugefügt
CWG 1596 C++98 Nicht-Array-Objekte wurden nur für Zwecke der Zeigerarithmetik
als zu Arrays mit einem Element gehörend betrachtet
die Regel wird auch
auf Vergleiche angewendet
CWG 1598 C++98 zwei Zeiger auf Member von Klassen, die unterschiedlich sind und
keine die Basisklasse der anderen ist, verglichen sich nicht gleich,
selbst wenn die Offsets der gezeigten Member gleich sein können
das Ergebnis ist
in diesem Fall
nicht spezifiziert
CWG 1858 C++98 es war nicht klar, ob zwei Zeiger auf Member,
die auf verschiedene Member derselben Union verweisen,
sich gleich verhalten, als ob sie auf denselben Member verweisen
sie vergleichen sich
in diesem Fall gleich
CWG 2419 C++98 ein Zeiger auf ein Nicht-Array-Objekt wurde nur als
Zeiger auf das erste Element eines Arrays der Größe 1 behandelt
beim Zeigervergleich, wenn der Zeiger durch & erhalten wurde
gilt für alle Zeiger
auf Nicht-Array-Objekte
CWG 2526 C++98 die Definition relationaler Vergleiche ( > , >= , < und <= ) von
Zeigern auf void und Funktionszeigern wurde durch N3624 entfernt
wiederhergestellt
CWG 2796 C++17 Funktionszeigerkonvertierungen wurden nicht auf den konvertierten
Zeigeroperanden während eingebauter relationaler Zeigervergleiche durchgeführt
führt diese
Konvertierungen in diesem Fall durch

Siehe auch

Häufige Operatoren
Zuweisung Inkrement
Dekrement
Arithmetik Logisch Vergleich Member
Zugriff
Sonstige

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b
a <=> b

a [ ... ]
* a
& a
a - > b
a. b
a - > * b
a. * b

Funktionsaufruf

a ( ... )
Komma

a, b
Bedingungsoperator

a ? b : c
Spezielle Operatoren

static_cast konvertiert einen Typ in einen anderen verwandten Typ
dynamic_cast konvertiert innerhalb von Vererbungshierarchien
const_cast fügt cv -Qualifizierer hinzu oder entfernt sie
reinterpret_cast konvertiert Typ zu einem unverwandten Typ
C-style cast konvertiert einen Typ zu einem anderen durch eine Kombination von static_cast , const_cast und reinterpret_cast
new erstellt Objekte mit dynamischer Speicherdauer
delete zerstört zuvor durch den new-Ausdruck erstellte Objekte und gibt den belegten Speicherbereich frei
sizeof fragt die Größe eines Typs ab
sizeof... fragt die Größe eines pack ab (seit C++11)
typeid fragt die Typinformationen eines Typs ab
noexcept prüft, ob ein Ausdruck eine Exception werfen kann (seit C++11)
alignof fragt die Ausrichtungsanforderungen eines Typs ab (seit C++11)

C-Dokumentation für Vergleichsoperatoren