std:: equality_comparable, std:: equality_comparable_with
|
Определено в заголовке
<concepts>
|
||
|
template
<
class
T
>
concept equality_comparable = __WeaklyEqualityComparableWith < T, T > ; |
(1) | (начиная с C++20) |
|
template
<
class
T,
class
U
>
concept equality_comparable_with
=
|
(2) | (начиная с C++20) |
|
Вспомогательные концепты
|
||
|
template
<
class
T,
class
U
>
concept __WeaklyEqualityComparableWith
=
|
(3) | ( только для демонстрации* ) |
| (4) | ||
|
template
<
class
T,
class
U
>
concept __ComparisonCommonTypeWith
=
|
(до C++23)
( только для демонстрации* ) |
|
|
template
<
class
T,
class
U,
class
C
=
std::
common_reference_t
<
const
T
&
,
const
U
&
>
>
concept _ComparisonCommonTypeWithImpl
=
|
(начиная с C++23)
( только для демонстрации* ) |
|
std::equality_comparable
определяет, что операторы сравнения
==
и
!=
для типа
T
отражают отношение равенства:
==
возвращает
true
тогда и только тогда, когда операнды равны.
std::equality_comparable_with
определяет, что операторы сравнения
==
и
!=
для (возможно, различных) операндов
T
и
U
дают результаты, соответствующие отношению равенства. Сравнение разнотипных операндов дает результаты, эквивалентные сравнению операндов, приведенных к их общему типу.
__WeaklyEqualityComparableWith
определяет, что объект типа
T
и объект типа
U
могут быть сравнены на равенство друг с другом (в любом порядке) с использованием как
==
, так и
!=
, и результаты сравнений являются согласованными.
__ComparisonCommonTypeWith
специфицирует, что два типа имеют общий тип, а const lvalue
или non-const rvalue
(начиная с C++23)
любого из этих типов конвертируемы в этот общий тип.
Содержание |
Семантические требования
Эти концепции моделируются только в том случае, если они удовлетворены и все подчинённые им концепции также моделируются.
В следующих параграфах, для данного выражения
E
и типа
C
,
CONVERT_TO
<
C
>
(
E
)
определяется как:
|
(до C++23) |
|
(начиная с C++23) |
a
и
b
типа
T
,
bool
(
a
==
b
)
равно
true
тогда и только тогда, когда
a
и
b
равны. В сочетании с требованием, что
a
==
b
является
сохраняющим равенство
, это подразумевает, что
==
является симметричным и транзитивным, а также что
==
является рефлексивным для всех объектов
a
, которые равны хотя бы одному другому объекту.
-
tиt2будут lvalue, обозначающими различные равные объекты типов const std:: remove_reference_t < T > и std:: remove_cvref_t < T > соответственно, -
uиu2будут lvalue, обозначающими различные равные объекты типов const std:: remove_reference_t < U > и std:: remove_cvref_t < U > соответственно, -
Cбудет std:: common_reference_t < const std:: remove_reference_t < T > & , const std:: remove_reference_t < U > & > ,
следующее выражение истинно:
- bool ( t == u ) == bool ( CONVERT_TO < C > ( t2 ) == CONVERT_TO < C > ( u2 ) ) .
-
t, lvalue типа const std:: remove_reference_t < T > и -
u, lvalue типа const std:: remove_reference_t < U > ,
выполняются следующие условия:
- t == u , u == t , t ! = u , u ! = t имеют одинаковую область определения;
- bool ( u == t ) == bool ( t == u ) ;
- bool ( t ! = u ) == ! bool ( t == u ) ; и
- bool ( u ! = t ) == bool ( t ! = u ) .
|
Соответствующая концепция
|
(до C++23) |
|
Пусть
выполняются следующие условия:
|
(начиная с C++23) |
Сохранение равенства
Выражения, объявленные в requires выражениях концепций стандартной библиотеки, должны быть equality-preserving (если не указано иное).
Вариации неявных выражений
Выражение requires expression , использующее выражение, которое является немодифицирующим для некоторого константного lvalue операнда, также требует неявных вариаций выражений .
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
-
-
18.5.4 Концепт
equality_comparable[concept.equalitycomparable]
-
18.5.4 Концепт
- Стандарт C++20 (ISO/IEC 14882:2020):
-
-
18.5.3 Концепт
equality_comparable[concept.equalitycomparable]
-
18.5.3 Концепт