std::three_way_comparable, std::three_way_comparable_with
定义在头文件 <compare> 中 |
||
template< class T, class Cat = std::partial_ordering > concept three_way_comparable = |
(1) | (自 C++20 起) |
template< class T, class U, class Cat = std::partial_ordering > concept three_way_comparable_with = |
(2) | (自 C++20 起) |
template< class T, class Cat > concept __ComparesAs = |
(3) | (仅说明*) |
std::three_way_comparable
指定了 T
上的三方比较运算符 <=>
生成的结果与 Cat
隐含的比较类别一致。std::three_way_comparable_with
指定了 (可能混合的) T
和 U
操作数上三方比较运算符 <=>
生成的结果与 Cat
隐含的比较类别一致。比较混合操作数会生成与比较转换为公共类型后的操作数等效的结果。__WeaklyEqualityComparableWith、__PartiallyOrderedWith 和 __ComparisonCommonTypeWith 是仅说明的概念。请参阅 equality_comparable
和 totally_ordered
的描述。
内容 |
[编辑] 语义要求
仅当满足这些概念并对所有它们包含的概念进行建模时,才会对它们进行建模。
T
和 Cat
仅在满足以下条件时才对 std::three_way_comparable<T, Cat> 进行建模,前提是给定类型为 const std::remove_reference_t<T> 的左值 a
和 b
,以下内容为真- (a <=> b == 0) == bool(a == b),
- (a <=> b != 0) == bool(a != b),
- ((a <=> b) <=> 0) 和 (0 <=> (b <=> a)) 相等,
- bool(a > b) == bool(b < a),
- bool(a >= b) == !bool(a < b),
- bool(a <= b) == !bool(b < a),
- (a <=> b < 0) == bool(a < b),
- (a <=> b > 0) == bool(a > b),
- (a <=> b <= 0) == bool(a <= b), and
- (a <=> b >= 0) == bool(a >= b), and
- 如果
Cat
可以转换为 std::strong_ordering,则T
符合totally_ordered
概念。
T
、U
和 Cat
仅当满足以下条件时才符合 std::three_way_comparable_with<T, U, Cat> 概念:-
t
和t2
是左值,分别表示类型为 const std::remove_reference_t<T> 和 std::remove_reference_t<T> 的不同但相等的两个对象。 -
u
和u2
是左值,分别表示类型为 const std::remove_reference_t<U> 和 std::remove_reference_t<U> 的不同但相等的两个对象。
令 C
为 std::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>,并且给定一个表达式 E
和一个类型 C
,令 CONVERT_TO<C>(E) 为
|
(在 C++23 之前) |
|
(从 C++23 开始) |
以下为真:
- t <=> u 和 u <=> t 具有相同的定义域,
- ((t <=> u) <=> 0) 和 (0 <=> (u <=> t)) 相等,
- (t <=> u == 0) == bool(t == u),
- (t <=> u != 0) == bool(t != u),
- Cat(t <=> u) == Cat(CONVERT_TO<C>(t2) <=> CONVERT_TO<C>(u2)),
- (t <=> u < 0) == bool(t < u),
- (t <=> u > 0) == bool(t > u),
- (t <=> u <= 0) == bool(t <= u),
- (t <=> u >= 0) == bool(t >= u), and
- 如果
Cat
可以转换为 std::strong_ordering,则T
和U
符合 std::totally_ordered_with<T, U> 概念。
[edit] 相等性保持
标准库概念的 requires 表达式 中声明的表达式必须是 相等性保持的(除非另有说明)。
[edit] 隐式表达式变体
对于某些常量左值操作数是非修改的表达式使用的 requires 表达式 还需要 隐式表达式变体。
[edit] 另请参阅
指定运算符 == 是等价关系 (概念) | |
指定类型上的比较运算符会产生一个全序 (概念) |