operator==,!=,<,<=,>,>=,<=>(std::tuple)
Defined in header <tuple>
|
||
template
<
class... TTypes, class... UTypes
>
bool operator==
(
const
std::tuple
<TTypes...>
& lhs, |
(1) | (since C++11) (constexpr since C++14) |
template
<
class... TTypes, class... UTypes
>
bool operator!
=
(
const
std::tuple
<TTypes...>
& lhs, |
(2) | (since C++11) (constexpr since C++14) (until C++20) |
template
<
class... TTypes, class... UTypes
>
bool operator<
(
const
std::tuple
<TTypes...>
& lhs, |
(3) | (since C++11) (constexpr since C++14) (until C++20) |
template
<
class... TTypes, class... UTypes
>
bool operator<=
(
const
std::tuple
<TTypes...>
& lhs, |
(4) | (since C++11) (constexpr since C++14) (until C++20) |
template
<
class... TTypes, class... UTypes
>
bool operator>
(
const
std::tuple
<TTypes...>
& lhs, |
(5) | (since C++11) (constexpr since C++14) (until C++20) |
template
<
class... TTypes, class... UTypes
>
bool operator>=
(
const
std::tuple
<TTypes...>
& lhs, |
(6) | (since C++11) (constexpr since C++14) (until C++20) |
template
<
class... TTypes, class... UTypes
>
constexpr
std::common_comparison_category_t
<
|
(7) | (since C++20) |
template
<
class... TTypes, tuple-like UTuple >
constexpr bool operator== ( const tuple<TTypes...> & lhs, const UTuple& rhs ) ; |
(8) | (since C++23) |
template
<
class... TTypes, tuple-like UTuple >
constexpr
std::common_comparison_category_t
<
|
(9) | (since C++23) |
If sizeof...(TTypes) does not equal sizeof...(UTypes), or
std::
get
<i>
(lhs)
== std::
get
<i>
(rhs)
is not a valid expression for any i in
[
0
,
sizeof...(Types)
)
If the type and value category of
std::
get
<i>
(lhs)
== std::
get
<i>
(rhs)
do not meet the BooleanTestable requirements for any i in
[
0
,
sizeof...(Types)
)
|
(until C++26) |
This overload participates in overload resolution only if sizeof...(TTypes) equals sizeof...(UTypes),
std::
get
<i>
(lhs)
== std::
get
<i>
(rhs)
is a valid expression and
decltype(std::
get
<i>
(lhs)
== std::
get
<i>
(rhs)
)
model
boolean-testable for every i in
[
0
,
sizeof...(Types)
)
|
(since 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
;
...
- For empty tuples, returns std::strong_ordering::equal.
- For non-empty tuples, the effect is equivalent to
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
object, and the number of elements of rhs is determined by
std::tuple_size_v<UTuple>
instead. This overload can only be found via argument-dependent lookup
tuple-like
object. /* Elems */ denotes the pack of types std::tuple_element_t<i, UTuple> for each i in
[
0
,
std::tuple_size_v<UTuple>
)
in increasing order. This overload can only be found via argument-dependent lookup
All comparison operators are short-circuited; they do not access tuple elements beyond what is necessary to determine the result of the comparison.
The |
(since C++20) |
Parameters
lhs, rhs | - | tuples to compare |
Return value
[
0
,
sizeof...(Types)
)
, otherwise false. For two empty tuples returns true
Notes
The relational operators are defined in terms of each element's operator<. |
(until C++20) |
The relational operators are defined in terms of synth-three-way, which uses operator<=> if possible, or operator< Notably, if an element type does not itself provide operator<=>, but is implicitly convertible to a three-way comparable type, that conversion will be used instead of operator< |
(since C++20) |
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_constrained_equality |
202403L |
(C++26) | Constrained operator== for std::tuple |
Example
Because operator< is defined for tuples, containers of tuples can be sorted.
#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"; }
Output:
{ 1, foo, 10.1 } { 2, bar, 3.14 } { 2, baz, -1.1 } { 2, baz, -0.1 }
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 2114 (P2167R3) |
C++11 | type preconditions for boolean operations were missing | added |
See also
(removed in C++20)
(removed in C++20)
(removed in C++20)
(removed in C++20)
(removed in C++20)
(C++20)
|
lexicographically compares the values in the pair (function template) |