operator==,!=,<,<=,>,>=,<=>(std::tuple)
| (1) <tuple>
|
||
template< class... TTypes, class... UTypes >
bool operator==( const std::tuple<TTypes...>& lhs,
const std::tuple<UTypes...>& rhs );
|
(начиная с C++11) | (constexpr начиная с C++14) (2) |
template< class... TTypes, class... UTypes >
bool operator!=( const std::tuple<TTypes...>& lhs,
const std::tuple<UTypes...>& rhs );
|
(начиная с C++11) | (constexpr начиная с C++14) (до C++20) (3) |
template< class... TTypes, class... UTypes >
bool operator<( const std::tuple<TTypes...>& lhs,
const std::tuple<UTypes...>& rhs );
|
(начиная с C++11) | (constexpr начиная с C++14) (до C++20) (4) |
template< class... TTypes, class... UTypes >
bool operator<=( const std::tuple<TTypes...>& lhs,
const std::tuple<UTypes...>& rhs );
|
(начиная с C++11) | (constexpr начиная с C++14) (до C++20) (5) |
template< class... TTypes, class... UTypes >
bool operator>( const std::tuple<TTypes...>& lhs,
const std::tuple<UTypes...>& rhs );
|
(начиная с C++11) | (constexpr начиная с C++14) (до C++20) (6) |
template< class... TTypes, class... UTypes >
bool operator>=( const std::tuple<TTypes...>& lhs,
const std::tuple<UTypes...>& rhs );
|
(начиная с C++11) | (constexpr начиная с C++14) (до C++20) (7) |
template< class... TTypes, class... UTypes >
constexpr std::common_comparison_category_t<
synth-three-way-result<TTypes, Elems>...>
operator<=>( const std::tuple<TTypes...>& lhs,
const std::tuple<UTypes...>& rhs );
|
(начиная с C++20) | (8) |
template< class... TTypes, tuple-like UTuple >
constexpr bool operator==( const tuple<TTypes...>& lhs, const UTuple& rhs );
|
(начиная с C++23) | (9) |
template< class... TTypes, tuple-like UTuple >
constexpr std::common_comparison_category_t<
synth-three-way-result<TTypes, /* Elems */>...>
operator<=>( const tuple<TTypes...>& lhs, const UTuple& rhs );
|
(начиная с C++23) | 1,2) |
lhs с помощью rhs.operator==1)true2)!(lhs == rhs) Если |
не равно
sizeof...(TTypes) или sizeof...(UTypes) не является корректным выражением для любого std::get<i>(lhs) == std::get<i>(rhs) в i, программа считается некорректной.[0, sizeof...(Types)) Если тип и категория значения не соответствуют требованиям std::get<i>(lhs) == std::get<i>(rhs)BooleanTestable для любого в i, поведение не определено.
[0, sizeof...(Types))(до C++26) |
Эта перегрузка участвует в разрешении перегрузки только если |
|
равно sizeof...(TTypes), sizeof...(UTypes) является корректным выражением и std::get<i>(lhs) == std::get<i>(rhs) удовлетворяют decltype(std::get<i>(lhs) == std::get<i>(rhs))boolean-testable для каждого в i.
[0, sizeof...(Types))(начиная с C++26) |
3-6) |
lhs лексикографически с помощью rhs, то есть сравнивает первые элементы, если они эквивалентны, сравнивает вторые элементы, если они эквивалентны, сравнивает третьи элементы и так далее.operator<3)false4)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; ... return std::get<N - 1>(lhs) < std::get<N - 1>(rhs);
!(rhs < lhs)5)rhs < lhs6)!(lhs < rhs) Если sizeof...(TTypes), или любое из выражений сравнения, указанных в выражениях, эквивалентных этим операторам, не является корректным выражением, программа считается некорректной.sizeof...(UTypes) Если тип и категория значения любого из выражений сравнения, указанных в выражениях, эквивалентных этим операторам, не соответствуют требованиям lhs лексикографически с помощью rhssynth-three-way, то есть сравнивает первые элементы, если они эквивалентны, сравнивает вторые элементы, если они эквивалентны, сравнивает третьи элементы и так далее.
Для пустых кортежей возвращает - std::strong_ordering::equal.Для непустых кортежей эффект эквивалентен
- synth-three-way
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 8)(std::get<N - 1>(lhs), std::get<N - 1>(rhs));
rhs, а количество элементов tuple-like определяется с помощью rhs. Эту перегрузку можно найти только через std::tuple_size_v<UTuple>поиск, зависящий от аргументов.9)rhs. tuple-like обозначает пакет типов /* Elems */ для каждого std::tuple_element_t<i, UTuple> в i в порядке возрастания. Эту перегрузку можно найти только через [0, std::tuple_size_v<UTuple>)поиск, зависящий от аргументов.Все операторы сравнения являются короткозамкнутыми; они не обращаются к элементам кортежа за пределами того, что необходимо для определения результата сравнения.
Операторы
|
, |
(начиная с C++20) |
Параметры
| lhs, rhs | - | кортежи для сравнения |
Возвращаемое значение
[
0
,
sizeof...
(
Types
)
)
, иначе
false
. Для двух пустых кортежей возвращает
true
.
Примечания
|
Операторы сравнения определяются через operator < каждого элемента. |
(до C++20) |
|
Операторы сравнения определяются через synth-three-way , который использует operator <=> если возможно, или operator < в противном случае. Важно отметить, что если тип элемента сам не предоставляет operator <=> , но неявно преобразуется в тип с трёхсторонним сравнением, это преобразование будет использовано вместо operator < . |
(начиная с C++20) |
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_constrained_equality
|
202403L
|
(C++26) | Ограниченный operator == для std::tuple |
Пример
Поскольку operator < определён для кортежей, контейнеры кортежей можно сортировать.
#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"; }
Вывод:
{ 1, foo, 10.1 }
{ 2, bar, 3.14 }
{ 2, baz, -1.1 }
{ 2, baz, -0.1 }
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
|
LWG 2114
( P2167R3 ) |
C++11 | отсутствовали предусловия типов для булевых операций | добавлены |
Смотрите также
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения в
pair
(шаблон функции) |