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 if and only if the operands are equal.std::equality_comparable_with specifies that the comparison operators == and != on (possibly mixed) T and U operands yield results consistent with equality. Comparing mixed operands yields results equivalent to comparing the operands converted to their common type.__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 !=, and the results of the comparisons are consistent. __ComparisonCommonTypeWith specifies that two types share a common type, and a const lvalue or a non-const rvalue(since C++23) of either type is convertible to that common type.Contents |
[edit] 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) is defined as:
|
(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 that are equal to at least one other object.-
tandt2be lvalues denoting distinct equal objects of types const std::remove_reference_t<T> and std::remove_cvref_t<T> respectively, -
uandu2be lvalues denoting distinct equal objects of types const std::remove_reference_t<U> and std::remove_cvref_t<U> respectively, -
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> and -
u, an lvalue of type const std::remove_reference_t<U>,
the following are true:
- t == u, u == t, t != u, u != t have the same domain;
- bool(u == t) == bool(t == u);
- bool(t != u) == !bool(t == u); and
- bool(u != t) == bool(t != u).
|
The corresponding |
(until C++23) |
|
Let
the following conditions hold:
|
(since C++23) |
[edit] Equality preservation
Expressions declared in requires expressions of the standard library concepts are required to be equality-preserving (except where stated otherwise).
[edit] Implicit expression variations
A requires expression that uses an expression that is non-modifying for some constant lvalue operand also requires implicit expression variations.
[edit] 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