operator==,!=,<,<=,>,>=,<=> (std::tuple)
|
Определено в заголовочном файле
<tuple>
|
||
|
template
<
class
...
TTypes
,
class
...
UTypes
>
bool
operator
==
(
const
std::
tuple
<
TTypes...
>
&
lhs,
|
(1) |
(начиная с C++11)
(constexpr начиная с C++14) |
|
template
<
class
...
TTypes
,
class
...
UTypes
>
bool
operator
!
=
(
const
std::
tuple
<
TTypes...
>
&
lhs,
|
(2) |
(начиная с C++11)
(constexpr начиная с C++14) (до C++20) |
|
template
<
class
...
TTypes
,
class
...
UTypes
>
bool
operator
<
(
const
std::
tuple
<
TTypes...
>
&
lhs,
|
(3) |
(начиная с C++11)
(constexpr начиная с C++14) (до C++20) |
|
template
<
class
...
TTypes
,
class
...
UTypes
>
bool
operator
<=
(
const
std::
tuple
<
TTypes...
>
&
lhs,
|
(4) |
(начиная с C++11)
(constexpr начиная с C++14) (до C++20) |
|
template
<
class
...
TTypes
,
class
...
UTypes
>
bool
operator
>
(
const
std::
tuple
<
TTypes...
>
&
lhs,
|
(5) |
(начиная с C++11)
(constexpr начиная с C++14) (до C++20) |
|
template
<
class
...
TTypes
,
class
...
UTypes
>
bool
operator
>=
(
const
std::
tuple
<
TTypes...
>
&
lhs,
|
(6) |
(начиная с C++11)
(constexpr начиная с C++14) (до C++20) |
|
template
<
class
...
TTypes
,
class
...
UTypes
>
constexpr
std::
common_comparison_category_t
<
|
(7) | (начиная с C++20) |
|
template
<
class
...
TTypes
, tuple
-
like UTuple
>
constexpr bool operator == ( const tuple < TTypes... > & lhs, const UTuple & rhs ) ; |
(8) | (начиная с C++23) |
|
template
<
class
...
TTypes
, tuple
-
like UTuple
>
constexpr
std::
common_comparison_category_t
<
|
(9) | (начиная с C++23) |
|
Если
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) |
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
;
...
- Для пустых кортежей возвращает std::strong_ordering::equal .
- Для непустых кортежей эффект эквивалентен
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
объектом, и количество элементов в
rhs
определяется с помощью
std::
tuple_size_v
<
UTuple
>
. Эта перегрузка может быть найдена только через
поиск, зависимый от аргументов
.
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
(шаблон функции) |