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 = | (2) | (C++20 起) |
辅助概念 | ||
template<class T, class U > concept __WeaklyEqualityComparableWith = | (3) | (仅用于阐述*) |
(4) | ||
template<class T, class U > concept __ComparisonCommonTypeWith = | (C++23 前) (仅用于阐述*) | |
template<class T, class U, class C =std::common_reference_t<const T&, const U&>> concept _ComparisonCommonTypeWithImpl = | (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) 当且仅当 a
和 b
相等才为 true。这与 a == b保持相等性的要求一同蕴含了,==
为对称且传递,而且 ==
进而对所有至少等于一个其他对象的 a
自反。t
和t2
分别为指代 conststd::remove_reference_t<T> 和 std::remove_cvref_t<T> 类型的不同但相等对象的左值,u
和u2
分别为指代 conststd::remove_reference_t<U> 和 std::remove_cvref_t<U> 类型的不同但相等对象的左值,C
为 std::common_reference_t<conststd::remove_reference_t<T>&, conststd::remove_reference_t<U>&>,
则下列表达式为 true:
- bool(t == u)==bool(CONVERT_TO<C>(t2)== CONVERT_TO<C>(u2))。
t
,conststd::remove_reference_t<T> 类型的左值,和u
,conststd::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 Concept
equality_comparable
[concept.equalitycomparable]
- 18.5.4 Concept
- C++20 标准(ISO/IEC 14882:2020):
- 18.5.3 Concept
equality_comparable
[concept.equalitycomparable]
- 18.5.3 Concept