命名空间
变体
操作

std::totally_ordered (自 C++20 起)std::totally_ordered_with (自 C++20 起)

来自 cppreference.com
< cpp‎ | concepts
定义在头文件 <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) (仅供说明*)
1) 概念 std::totally_ordered 指定了类型上的比较运算符 ==,!=,<,>,<=,>= 产生的结果与类型上的 严格全序 一致。
2) 概念 std::totally_ordered_with 指定了在(可能混合的)TU 操作数上的比较运算符 ==,!=,<,>,<=,>= 产生的结果与严格全序一致。比较混合操作数产生的结果等效于将操作数转换为其公共类型后进行比较。
3) 仅供说明的概念 __PartiallyOrderedWith 指定了类型 T 的值和类型 U 的值可以使用 <><=>= 以部分序的方式相互比较(以任意顺序),并且比较结果一致。

内容

[编辑] 语义需求

这些概念仅在满足它们且它们包含的所有概念都被建模时才被建模。

1) std::totally_ordered<T> 仅在满足以下条件时才被建模:给定类型 const std::remove_reference_t<T> 的左值 abc
  • 只有 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> 仅在满足以下条件时才被建模:给定

Cstd::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>,并且给定表达式 E 和类型 C,设 CONVERT_TO<C>(E)

(直到 C++23)
  • static_cast<const C&>(std::as_const(E)) 如果这是一个有效的表达式,
  • static_cast<const C&>(std::move(E)) 否则。
(自 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> 仅在给定以下条件时建模

以下为真

  • 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]
  • C++20 标准(ISO/IEC 14882:2020)
  • 18.5.4 概念 totally_ordered [concept.totallyordered]

[编辑] 另请参见

指定运算符 <=> 在给定类型上产生一致的结果
(concept) [编辑]