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 的描述。
目录 |
[编辑] 语义要求
这些概念仅当它们被满足并且它们所包含的所有概念都被建模时才被建模。
a 和 b 时,T 和 Cat 才符合 std::three_way_comparable<T, Cat> 模型,并且以下条件成立:- (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),以及
- (a <=> b >= 0) == bool(a >= b),以及
- 如果
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),以及
- 如果
Cat可转换为 std::strong_ordering,则T和U符合 std::totally_ordered_with<T, U> 模型。
[编辑] 相等性保持
标准库概念的 requires 表达式中声明的表达式必须是相等性保持的(除非另有说明)。
[编辑] 隐式表达式变体
使用对于某个常量左值操作数是非修改表达式的 requires 表达式 也需要隐式表达式变体。
[编辑] 另请参见
| 指定运算符 == 是等价关系 (概念) | |
| 指定类型上的比较运算符产生全序关系 (概念) |