operator==,!=,<,<=,>,>=,<=>(std::tuple)
| Definiert in der Header-Datei <tuple> |
||
template< class... TTypes, class... UTypes > bool operator==( const std::tuple<TTypes...>& lhs, |
(1) | (seit C++11) (constexpr seit C++14) |
template< class... TTypes, class... UTypes > bool operator!=( const std::tuple<TTypes...>& lhs, |
(2) | (seit C++11) (constexpr seit C++14) (bis C++20) |
template< class... TTypes, class... UTypes > bool operator<( const std::tuple<TTypes...>& lhs, |
(3) | (seit C++11) (constexpr seit C++14) (bis C++20) |
template< class... TTypes, class... UTypes > bool operator<=( const std::tuple<TTypes...>& lhs, |
(4) | (seit C++11) (constexpr seit C++14) (bis C++20) |
template< class... TTypes, class... UTypes > bool operator>( const std::tuple<TTypes...>& lhs, |
(5) | (seit C++11) (constexpr seit C++14) (bis C++20) |
template< class... TTypes, class... UTypes > bool operator>=( const std::tuple<TTypes...>& lhs, |
(6) | (seit C++11) (constexpr seit C++14) (bis C++20) |
| template< class... TTypes, class... UTypes > constexpr std::common_comparison_category_t< |
(7) | (seit C++20) |
| template< class... TTypes, tuple-like UTuple > constexpr bool operator==( const tuple<TTypes...>& lhs, const UTuple& rhs ); |
(8) | (seit C++23) |
| template< class... TTypes, tuple-like UTuple > constexpr std::common_comparison_category_t< |
(9) | (seit C++23) |
|
Wenn sizeof...(TTypes) nicht gleich sizeof...(UTypes) ist, oder std::get<i>(lhs) == std::get<i>(rhs) für ein i in
[0, sizeof...(Types)) kein gültiger Ausdruck ist, ist das Programm schlecht formatiert. Wenn der Typ und die Wertkategorie von std::get<i>(lhs) == std::get<i>(rhs) für ein i in [0, sizeof...(Types)) die BooleanTestable-Anforderungen nicht erfüllen, ist das Verhalten undefiniert. |
(bis C++26) |
|
Diese Überladung nimmt nur an der Overload-Auflösung teil, wenn sizeof...(TTypes) gleich sizeof...(UTypes) ist, std::get<i>(lhs) == std::get<i>(rhs) ein gültiger Ausdruck ist und decltype(std::get<i>(lhs) == std::get<i>(rhs)) für jedes i in [0, sizeof...(Types)) die boolean-testable-Bedingungen erfüllt. |
(seit C++26) |
if (std::get<0>(lhs) < std::get<0>(rhs)) return true;
if (std::get<0>(rhs) < std::get<0>(lhs)) return false;
if (std::get<1>(lhs) < std::get<1>(rhs)) return true;
if (std::get<1>(rhs) < std::get<1>(lhs)) return false;
...
- Für leere Tupel wird std::strong_ordering::equal zurückgegeben.
- Für nicht-leere Tupel ist die Auswirkung äquivalent zu
if (auto c = synth-three-way(std::get<0>(lhs), std::get<0>(rhs)); c != 0) return c;
if (auto c = synth-three-way(std::get<1>(lhs), std::get<1>(rhs)); c != 0) return c;
...
return synth-three-way(std::get<N - 1>(lhs), std::get<N - 1>(rhs));
tuple-like-Objekt und die Anzahl der Elemente von rhs wird stattdessen durch std::tuple_size_v<UTuple> bestimmt. Diese Überladung kann nur über argumentabhängige Auflösung gefunden werden.tuple-like-Objekt. /* Elems */ bezeichnet die Packung von Typen std::tuple_element_t<i, UTuple> für jedes i in aufsteigender Reihenfolge in [0, std::tuple_size_v<UTuple>). Diese Überladung kann nur über argumentabhängige Auflösung gefunden werden.Alle Vergleichsoperatoren werden kurzgeschlossen; sie greifen nicht auf Tupel-Elemente zu, die über das für die Bestimmung des Vergleichsergebnisses Notwendige hinausgehen.
|
Die Operatoren |
(seit C++20) |
Inhalt |
[edit] Parameter
| lhs, rhs | - | Zu vergleichende Tupel |
[edit] Rückgabewert
[0, sizeof...(Types)) gilt, andernfalls false. Für zwei leere Tupel wird true zurückgegeben.[edit] Hinweise
|
Die relationalen Operatoren sind in Bezug auf den operator< jedes Elements definiert. |
(bis C++20) |
|
Die relationalen Operatoren sind in Bezug auf synth-three-way definiert, der, wenn möglich, `operator<=>` und andernfalls `operator<` verwendet. Insbesondere, wenn ein Elementtyp nicht selbst operator<=> bereitstellt, aber implizit in einen dreiwertig vergleichbaren Typ konvertierbar ist, wird diese Konvertierung anstelle von operator< verwendet. |
(seit C++20) |
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_constrained_equality |
202403L |
(C++26) | Eingeschränkter operator== für std::tuple |
[edit] Beispiel
Da operator< für Tupel definiert ist, können Container von Tupeln sortiert werden.
#include <algorithm> #include <iostream> #include <tuple> #include <vector> int main() { std::vector<std::tuple<int, std::string, float>> v { {2, "baz", -0.1}, {2, "bar", 3.14}, {1, "foo", 10.1}, {2, "baz", -1.1}, }; std::sort(v.begin(), v.end()); for (const auto& p: v) std::cout << "{ " << get<0>(p) << ", " << get<1>(p) << ", " << get<2>(p) << " }\n"; }
Ausgabe
{ 1, foo, 10.1 }
{ 2, bar, 3.14 }
{ 2, baz, -1.1 }
{ 2, baz, -0.1 }[edit] Meldungen
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++11 | Typ-Präbedingungen für boolesche Operationen fehlten | hinzugefügt |
[edit] Siehe auch
| (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(Funktionsvorlage) |