std::equality_comparable, std::equality_comparable_with
Defined in header <concepts>
|
||
template
<
class T >
concept equality_comparable = __WeaklyEqualityComparableWith<T, T> ; |
(1) | (since C++20) |
template
<
class T, class U >
concept equality_comparable_with =
|
(2) | (since C++20) |
Helper concepts |
||
template
<
class T, class U >
concept __WeaklyEqualityComparableWith =
|
(3) | (exposition only*) |
(4) | ||
template
<
class T, class U >
concept __ComparisonCommonTypeWith =
|
(until C++23)
(exposition only*) |
|
template
<
class T, class U, class C =
std::common_reference_t
<
const T&, const U&
>
>
concept _ComparisonCommonTypeWithImpl =
|
(since C++23)
(exposition only*) |
|
std::equality_comparable
specifies that the comparison operators ==
and !=
on T
reflects equality: ==
yields true
std::equality_comparable_with
specifies that the comparison operators ==
and !=
on (possibly mixed) T
and U
__WeaklyEqualityComparableWith
specifies that an object of type T
and an object of type U
can be compared for equality with each other (in either order) using both ==
and !=
__ComparisonCommonTypeWith
specifies that two types share a common type, and a const lvalueor a non-const rvalue(since C++23)
Semantic requirements
These concepts are modeled only if they are satisfied and all concepts they subsume are modeled.
In the following paragraphs, given an expression E
and a type C
, CONVERT_TO<C>(E)
|
(until C++23) |
|
(since C++23) |
a
and b
of type T
, bool(a == b) is true if and only if a
and b
are equal. Together with the requirement that a == b is equality-preserving, this implies that ==
is symmetric and transitive, and further that ==
is reflexive for all objects a
-
t
andt2
be lvalues denoting distinct equal objects of types const std::remove_reference_t <T> and std::remove_cvref_t<T> -
u
andu2
be lvalues denoting distinct equal objects of types const std::remove_reference_t <U> and std::remove_cvref_t<U> -
C
be std::common_reference_t < const std::remove_reference_t <T> &, const std::remove_reference_t <U> & >
the following expression is true:
- bool (t == u) == bool (CONVERT_TO<C> (t2) == CONVERT_TO<C> (u2) )
-
t
, an lvalue of type const std::remove_reference_t <T> -
u
, an lvalue of type const std::remove_reference_t <U>
the following are true:
- 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)
The corresponding |
(until C++23) |
Let
the following conditions hold:
|
(since C++23) |
Equality preservation
Expressions declared in requires expressions of the standard library concepts are required to be equality-preserving
Implicit expression variations
A requires expression that uses an expression that is non-modifying for some constant lvalue operand also requires implicit expression variations
References
- C++23 standard (ISO/IEC 14882:2024):
- 18.5.4 Concept
equality_comparable
[concept.equalitycomparable]
- 18.5.4 Concept
- C++20 standard (ISO/IEC 14882:2020):
- 18.5.3 Concept
equality_comparable
[concept.equalitycomparable]
- 18.5.3 Concept