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 |
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) |
Equality preservation
Expressions declared in requires expressions of the standard library concepts are required to be equality-preserving (except where stated otherwise).
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