std::totally_ordered, std::totally_ordered_with
来自cppreference.com
<tbody>
</tbody>
| 在标头 <concepts> 定义
|
||
template< class T > concept totally_ordered = std::equality_comparable<T> && __PartiallyOrderedWith<T, T>; |
(1) | (C++20 起) |
template< class T, class U > concept totally_ordered_with = std::totally_ordered<T> && std::totally_ordered<U> && std::equality_comparable_with<T, U> && std::totally_ordered< std::common_reference_t< const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>> && __PartiallyOrderedWith<T, U>; |
(2) | (C++20 起) |
| 辅助概念 |
||
template< class T, class U > concept __PartiallyOrderedWith = requires(const std::remove_reference_t<T>& t, const std::remove_reference_t<U>& u) { { t < u } -> boolean-testable; { t > u } -> boolean-testable; { t <= u } -> boolean-testable; { t >= u } -> boolean-testable; { u < t } -> boolean-testable; { u > t } -> boolean-testable; { u <= t } -> boolean-testable; { u >= t } -> boolean-testable; }; |
(3) | (仅用于阐述*) |
2) 概念
std::totally_ordered_with 指定比较运算符 ==,!=,<,>,<=,>= 在(可能混合的) T 和 U 操作数上产生的结果等价于对转换到其公共类型的操作数进行比较的结果。3) 仅用于阐释的概念
__PartiallyOrderedWith 指定 T 类型的对象与 U 类型的对象能(以任何顺序)用 <、>、<= 及 >= 在一个偏序中彼此比较,且比较结果一致。语义要求
这些概念仅若其所蕴含的概念均被实现才得到实现。
1)
std::totally_ordered<T> 仅若符合下列条件才得到实现。给定 const std::remove_reference_t<T> 类型左值 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)
2)
std::totally_ordered_with<T, U> 仅若符合下列条件才得到实现。给定
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))
3)
__PartiallyOrderedWith<T, U> 仅若符合下列条件才得到实现,给定
- 任何
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 Concept
totally_ordered[concept.totallyordered]
- 18.5.5 Concept
- C++20 标准(ISO/IEC 14882:2020):
- 18.5.4 Concept
totally_ordered[concept.totallyordered]
- 18.5.4 Concept
参阅
指定运算符 <=> 在给定类型上产生一致的结果 (概念) |