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 =
std::equality_comparable<T> &&
std::equality_comparable<U> &&
__ComparisonCommonTypeWith<T, U> &&
std::equality_comparable<
std::common_reference_t<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>> &&
__WeaklyEqualityComparableWith<T, U>;
|
(2) | (自 C++20 起) |
| 辅助概念 |
||
template< class T, class U >
concept __WeaklyEqualityComparableWith =
requires(const std::remove_reference_t<T>& t,
const std::remove_reference_t<U>& u) {
{ t == u } -> boolean-testable;
{ t != u } -> boolean-testable;
{ u == t } -> boolean-testable;
{ u != t } -> boolean-testable;
};
|
(3) | (仅用于阐述*) |
template< class T, class U >
concept __ComparisonCommonTypeWith =
std::common_reference_with<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>;
|
(4) | (直到 C++23) (仅用于阐述*) |
template< class T, class U, class C = std::common_reference_t<const T&, const U&> >
concept _ComparisonCommonTypeWithImpl =
std::same_as<std::common_reference_t<const T&, const U&>,
std::common_reference_t<const U&, const T&>> &&
requires {
requires std::convertible_to<const T&, const C&> ||
std::convertible_to<T, const C&>;
requires std::convertible_to<const U&, const C&> ||
std::convertible_to<U, const C&>;
};
template< class T, class U >
concept __ComparisonCommonTypeWith =
_ComparisonCommonTypeWithImpl<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
|
(自 C++23 起) (仅用于阐述*) |
|
std::equality_comparable 规定比较运算符 == 和 != 对 T 反映相等性:== 当且仅当操作数相等时产生 true 。std::equality_comparable_with 规定比较运算符 == 和 != 对(可能混合的)T 和 U 操作数产生与相等性一致的结果。比较混合操作数产生的结果等价于比较转换到其公共类型后的操作数。__WeaklyEqualityComparableWith 规定类型为 T 的对象和类型为 U 的对象可以彼此比较是否相等(无论顺序),同时使用 == 和 !=,并且比较结果一致。__ComparisonCommonTypeWith 规定两个类型共享一个公共类型,并且任一类型的 const 左值或非 const 右值(自 C++23 起)可转换到该公共类型。语义要求
这些概念仅在它们被满足且所有它们所包含的概念都被建模时才会被建模。
在以下段落中,给定表达式
E
和类型
C
,
CONVERT_TO
<
C
>
(
E
)
的定义如下:
|
(C++23 前) |
|
(C++23 起) |
T
的对象
a
和
b
,
bool
(
a
==
b
)
为
true
当且仅当
a
和
b
相等。结合
a
==
b
需满足
等值保持性
的要求,这意味着
==
具有对称性和传递性,并且进一步表明对于所有至少与另一个对象相等的对象
a
,
==
具有自反性。
-
t和t2为分别表示类型 const std:: remove_reference_t < T > 和 std:: remove_cvref_t < T > 的不同但相等的对象的左值, -
u和u2为分别表示类型 const std:: remove_reference_t < U > 和 std:: remove_cvref_t < U > 的不同但相等的对象的左值, -
C为 std:: common_reference_t < const std:: remove_reference_t < T > & , const std:: remove_reference_t < U > & > ,
则以下表达式为真:
- bool ( t == u ) == bool ( CONVERT_TO < C > ( t2 ) == CONVERT_TO < C > ( u2 ) ) 。
-
t,类型为 const std:: remove_reference_t < T > 的左值,以及 -
u,类型为 const std:: remove_reference_t < U > 的左值,
以下表达式均为真:
- 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 ) 。
|
对应的
|
(C++23 前) |
|
令
需满足以下条件:
|
(C++23 起) |
等值保持性
标准库概念的 requires 表达式 中声明的表达式必须满足 等值保持 要求(除非另有说明)。
隐式表达式变体
对于某个常量左值操作数使用非修改表达式的 requires 表达式 同样需要 隐式表达式变体 。
参考文献
- C++23 标准 (ISO/IEC 14882:2024):
-
-
18.5.4 概念
equality_comparable[concept.equalitycomparable]
-
18.5.4 概念
- C++20 标准 (ISO/IEC 14882:2020):
-
-
18.5.3 概念
equality_comparable[concept.equalitycomparable]
-
18.5.3 概念