operator==,!=,<,<=,>,>=,<=> (std::tuple)
|
Definiert im Header
<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 irgendein
i
in
[
0
,
sizeof...
(
Types
)
)
kein gültiger Ausdruck ist, ist das Programm fehlerhaft.
Wenn der Typ und die Wertkategorie von
std
::
get
<
i
>
(
lhs
)
==
std
::
get
<
i
>
(
rhs
)
für irgendein
i
in
[
0
,
sizeof...
(
Types
)
)
nicht die
BooleanTestable
-Anforderungen erfüllen, ist das Verhalten undefiniert.
|
(bis C++26) |
|
Diese Überladung nimmt nur dann an der Überladungsauflö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
)
)
das Konzept
boolean-testable
für jedes
i
in
[
0
,
sizeof...
(
Types
)
)
modelliert.
|
(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 der Effekt ä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 ist und die Anzahl der Elemente von
rhs
durch
std::
tuple_size_v
<
UTuple
>
bestimmt wird. Diese Überladung kann nur durch
argumentabhängige Suche
gefunden werden.
tuple-like
-Objekt ist.
/* Elems */
bezeichnet das Paket der Typen
std::
tuple_element_t
<
i, UTuple
>
für jedes
i
in
[
0
,
std::
tuple_size_v
<
UTuple
>
)
in aufsteigender Reihenfolge. Diese Überladung kann nur über
argumentabhängige Namenssuche
gefunden werden.
Alle Vergleichsoperatoren sind kurzgeschlossen; sie greifen nicht auf Tupel-Elemente zu, die über das zur Bestimmung des Vergleichsergebnisses notwendige Maß hinausgehen.
|
Die Operatoren
|
(since C++20) |
Inhaltsverzeichnis |
Parameter
| lhs, rhs | - | zu vergleichende Tupel |
Rückgabewert
[
0
,
sizeof...
(
Types
)
)
, andernfalls
false
. Für zwei leere Tupel wird
true
zurückgegeben.
Hinweise
|
Die relationalen Operatoren werden anhand des operator < jedes Elements definiert. |
(bis C++20) |
|
Die relationalen Operatoren werden anhand von synth-three-way definiert, welches operator <=> verwendet, falls möglich, andernfalls operator < . Insbesondere, wenn ein Elementtyp selbst keinen operator <=> bereitstellt, aber implizit in einen dreiweg-vergleichbaren Typ konvertierbar ist, wird diese Konvertierung anstelle von operator < verwendet. |
(seit C++20) |
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_constrained_equality
|
202403L
|
(C++26) | Eingeschränkter operator == für std::tuple |
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 }
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 |
|---|---|---|---|
|
LWG 2114
( P2167R3 ) |
C++11 | Typ-Präbedingungen für boolesche Operationen fehlten | hinzugefügt |
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
(Funktionstemplate) |