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 =
std::equality_comparable<T> &&
std::equality_comparable<U> &&
__ComparisonCommonTypeWith<T, U> &&
std::equality_comparable<
std::common_reference_t<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>> &&
__WeaklyEqualityComparableWith<T, U>;
|
(2) | (начиная с C++20) |
| Вспомогательные концепции |
||
template< class T, class U >
concept __WeaklyEqualityComparableWith =
requires(const std::remove_reference_t<T>& t,
const std::remove_reference_t<U>& u) {
{ t == u } -> boolean-testable;
{ t != u } -> boolean-testable;
{ u == t } -> boolean-testable;
{ u != t } -> boolean-testable;
};
|
(3) | (только для демонстрации*) |
template< class T, class U >
concept __ComparisonCommonTypeWith =
std::common_reference_with<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>;
|
(4) | (до C++23) (только для демонстрации*) |
template< class T, class U, class C = std::common_reference_t<const T&, const U&> >
concept _ComparisonCommonTypeWithImpl =
std::same_as<std::common_reference_t<const T&, const U&>,
std::common_reference_t<const U&, const T&>> &&
requires {
requires std::convertible_to<const T&, const C&> ||
std::convertible_to<T, const C&>;
requires std::convertible_to<const U&, const C&> ||
std::convertible_to<U, const C&>;
};
template< class T, class U >
concept __ComparisonCommonTypeWith =
_ComparisonCommonTypeWithImpl<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
|
(начиная с 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 Концепт