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

参阅

指定运算符 <=> 在给定类型上产生一致的结果
(概念)