Comparison operators
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]
|
|
||||
Inhaltsverzeichnis |
Zweiseitiger Vergleich
Der Zwei-Wege-Vergleichsoperator-Ausdruck hat die Form
Relationsoperatoren
lhs
<
rhs
|
(1) | ||||||||
lhs
>
rhs
|
(2) | ||||||||
lhs
<=
rhs
|
(3) | ||||||||
lhs
>=
rhs
|
(4) | ||||||||
` 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) | ||||||||
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
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
C1bezieht und der andere auf ein Member einer anderen KlasseC2, 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:
- Aufrufen des operator ( ) der Zeigertyp-Spezialisierungen von std::less , std::greater , std::less_equal , und std::greater_equal .
|
(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
)
;
|
||
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
DreifachvergleichDer Drei-Wege-Vergleichsoperator-Ausdruck hat die Form
Der Ausdruck gibt ein Objekt zurück, sodass
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 beide Operanden denselben Enumerationstyp
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:
Andernfalls ist das Programm fehlerhaft.
Überladungen
Bei
Überlagerungsauflösung gegenüber benutzerdefinierten Operatoren
, für Zeiger- oder Aufzählungstyp
Wo
Diesen Code ausführen
#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.
|
(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>
)
|
|
(entfernt in C++20)
(C++20)
|
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) |
|
(entfernt in C++20)
(C++20)
|
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
|
|
|
(veraltet in C++20)
|
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
- Operator-Präzedenz
- Operator-Überladung
- Compare (Named Requirements)
| Häufige Operatoren | ||||||
|---|---|---|---|---|---|---|
| Zuweisung |
Inkrement
Dekrement |
Arithmetik | Logisch | Vergleich |
Member
Zugriff |
Sonstige |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
Funktionsaufruf
a ( ... ) |
|
Komma
a, b |
||||||
|
Bedingungsoperator
a ? b : c |
||||||
| Spezielle Operatoren | ||||||
|
static_cast
konvertiert einen Typ in einen anderen verwandten Typ
|
||||||
|
C-Dokumentation
für
Vergleichsoperatoren
|