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&> > |
(начиная с C++23) (только для пояснения*) |
|
std::equality_comparable
определяет, что операторы сравнения ==
и !=
над T
отражают равенство: ==
возвращает true тогда и только тогда, когда операнды равны.std::equality_comparable_with
определяет, что операторы сравнения ==
и !=
над (возможно, смешанными) операндами T
и U
дают результаты, согласующиеся с равенством. Сравнение смешанных операндов даёт результаты, эквивалентные сравнению операндов, преобразованных к их общему типу.__WeaklyEqualityComparableWith
определяет, что объект типа T
и объект типа U
можно сравнивать на равенство друг с другом ( в любом порядке), используя как ==
, так и !=
, и результаты сравнения согласуются.__ComparisonCommonTypeWith
указывает, что два типа имеют общий тип, а константное значение lvalue ли неконстантное значение 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
это