operator==,!=,<,<=,>,>=,<=>(std::pair)
Defined in header <utility> | ||
(1) | ||
(until C++14) | ||
(since C++14) | ||
(2) | ||
(until C++14) | ||
(since C++14) (until C++20) | ||
(3) | ||
(until C++14) | ||
(since C++14) (until C++20) | ||
(4) | ||
(until C++14) | ||
(since C++14) (until C++20) | ||
(5) | ||
(until C++14) | ||
(since C++14) (until C++20) | ||
(6) | ||
(until C++14) | ||
(since C++14) (until C++20) | ||
template<class T1, class T2, class U1, class U2 > constexprstd::common_comparison_category_t<synth-three-way-result<T1, U1>, | (7) | (since C++20) |
The behavior is undefined if the type and value category of either lhs.first== rhs.first or lhs.second== rhs.second do not meet the BooleanTestable requirements. | (until C++26) |
This overload participates in overload resolution only if both decltype(lhs.first== rhs.first) and decltype(lhs.second== rhs.second) model | (since C++26) |
synth-three-way
.The | (since C++20) |
Contents |
[edit]Parameters
lhs, rhs | - | pairs to compare |
[edit]Return value
[edit]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< otherwise. 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::pair |
[edit]Example
Because operator< is defined for pairs, containers of pairs can be sorted.
#include <algorithm>#include <iomanip>#include <iostream>#include <string>#include <utility>#include <vector> int main(){std::vector<std::pair<int, std::string>> v ={{2, "baz"}, {2, "bar"}, {1, "foo"}};std::sort(v.begin(), v.end()); for(auto p : v)std::cout<<'{'<< p.first<<", "<<std::quoted(p.second)<<"}\n";}
Output:
{1, "foo"} {2, "bar"} {2, "baz"}
[edit]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 296 | C++98 | the descriptions of operators other than == and < were missing | added |
LWG 2114 (P2167R3) | C++98 | type preconditions for boolean operations were missing | added |
LWG 3865 | C++98 | comparison operators only accepted pair s of the same type | accept pair s of different types |
[edit]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 tuple (function template) |