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
-
tandt2be lvalues denoting distinct equal objects of types const std::remove_reference_t <T> and std::remove_cvref_t<T> -
uandu2be lvalues denoting distinct equal objects of types const std::remove_reference_t <U> and std::remove_cvref_t<U> -
Cbe 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