std::totally_ordered (自 C++20 起),std::totally_ordered_with (自 C++20 起)
定义在头文件 <concepts> 中 |
||
template< class T > concept totally_ordered = |
(1) | (自 C++20 起) |
template< class T, class U > concept totally_ordered_with = |
(2) | (自 C++20 起) |
辅助概念 |
||
template< class T, class U > concept __PartiallyOrderedWith = |
(3) | (仅供说明*) |
std::totally_ordered_with
指定了在(可能混合的)T
和 U
操作数上的比较运算符 ==,!=,<,>,<=,>=
产生的结果与严格全序一致。比较混合操作数产生的结果等效于将操作数转换为其公共类型后进行比较。__PartiallyOrderedWith
指定了类型 T
的值和类型 U
的值可以使用 <
、>
、<=
和 >=
以部分序的方式相互比较(以任意顺序),并且比较结果一致。内容 |
[编辑] 语义需求
这些概念仅在满足它们且它们包含的所有概念都被建模时才被建模。
a
、b
和 c
- 只有 bool(a < b)、bool(a > b) 和 bool(a == b) 中的一个为 true;
- 如果 bool(a < b) 和 bool(b < c) 都为 true,则 bool(a < c) 为 true;
- bool(a > b) == bool(b < a)
- bool(a >= b) == !bool(a < b)
- bool(a <= b) == !bool(b < a)
-
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 起) |
以下为真
- bool(t < u) == bool(CONVERT_TO<C>(t2) < CONVERT_TO<C>(u2))
- bool(t > u) == bool(CONVERT_TO<C>(t2) > CONVERT_TO<C>(u2))
- bool(t <= u) == bool(CONVERT_TO<C>(t2) <= CONVERT_TO<C>(u2))
- bool(t >= u) == bool(CONVERT_TO<C>(t2) >= CONVERT_TO<C>(u2))
- bool(u < t) == bool(CONVERT_TO<C>(u2) < CONVERT_TO<C>(t2))
- bool(u > t) == bool(CONVERT_TO<C>(u2) > CONVERT_TO<C>(t2))
- bool(u <= t) == bool(CONVERT_TO<C>(u2) <= CONVERT_TO<C>(t2))
- bool(u >= t) == bool(CONVERT_TO<C>(u2) >= CONVERT_TO<C>(t2))
- 任何类型为 const std::remove_reference_t<T> 的左值
t
,以及 - 任何类型为 const std::remove_reference_t<U> 的左值
u
,
以下为真
- t < u, t <= u, t > u, t >= u, u < t, u <= t, u > t, 以及 u >= t 具有相同的域;
- bool(t < u) == bool(u > t);
- bool(u < t) == bool(t > u);
- bool(t <= u) == bool(u >= t); 以及
- bool(u <= t) == bool(t >= u).
[编辑] 等式保持
标准库概念的 requires 表达式 中声明的表达式必须是 等式保持的(除非另有说明)。
[编辑] 隐式表达式变体
使用对某些常量左值操作数而言是非修改的表达式的 requires 表达式 也要求 隐式表达式变体。
[编辑] 参考文献
- C++23 标准(ISO/IEC 14882:2024)
- 18.5.5 概念
totally_ordered
[concept.totallyordered]
- 18.5.5 概念
- C++20 标准(ISO/IEC 14882:2020)
- 18.5.4 概念
totally_ordered
[concept.totallyordered]
- 18.5.4 概念
[编辑] 另请参见
指定运算符 <=> 在给定类型上产生一致的结果 (concept) |