命名空间
变体
操作

std::three_way_comparable, std::three_way_comparable_with

来自 cppreference.com
< cpp‎ | utility
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三方比较
three_way_comparablethree_way_comparable_with
(C++20)(C++20)
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
定义在头文件 <compare>
template< class T, class Cat = std::partial_ordering >

concept three_way_comparable =
    __WeaklyEqualityComparableWith<T, T> &&
    __PartiallyOrderedWith<T, T> &&
    requires(const std::remove_reference_t<T>& a,
             const std::remove_reference_t<T>& b) {
        { a <=> b } -> __ComparesAs<Cat>;

    };
(1) (自 C++20 起)
template< class T, class U, class Cat = std::partial_ordering >

concept three_way_comparable_with =
    std::three_way_comparable<T, Cat> &&
    std::three_way_comparable<U, Cat> &&
    __ComparisonCommonTypeWith<T, U> &&
    std::three_way_comparable<
        std::common_reference_t<
            const std::remove_reference_t<T>&,
            const std::remove_reference_t<U>&>, Cat> &&
    __WeaklyEqualityComparableWith<T, U> &&
    __PartiallyOrderedWith<T, U> &&
    requires(const std::remove_reference_t<T>& t,
             const std::remove_reference_t<U>& u) {
        { t <=> u } -> __ComparesAs<Cat>;
        { u <=> t } -> __ComparesAs<Cat>;

    };
(2) (自 C++20 起)
template< class T, class Cat >

concept __ComparesAs =

    std::same_as<std::common_comparison_category_t<T, Cat>, Cat>;
(3) (仅说明*)
1) 概念 std::three_way_comparable 指定了 T 上的三方比较运算符 <=> 生成的结果与 Cat 隐含的比较类别一致。
2) 概念 std::three_way_comparable_with 指定了 (可能混合的) TU 操作数上三方比较运算符 <=> 生成的结果与 Cat 隐含的比较类别一致。比较混合操作数会生成与比较转换为公共类型后的操作数等效的结果。

__WeaklyEqualityComparableWith__PartiallyOrderedWith__ComparisonCommonTypeWith 是仅说明的概念。请参阅 equality_comparabletotally_ordered 的描述。

内容

[编辑] 语义要求

仅当满足这些概念并对所有它们包含的概念进行建模时,才会对它们进行建模。

1) TCat 仅在满足以下条件时才对 std::three_way_comparable<T, Cat> 进行建模,前提是给定类型为 const std::remove_reference_t<T> 的左值 ab,以下内容为真
  • (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), and
  • (a <=> b >= 0) == bool(a >= b), and
  • 如果 Cat 可以转换为 std::strong_ordering,则 T 符合 totally_ordered 概念。
2) TUCat 仅当满足以下条件时才符合 std::three_way_comparable_with<T, U, Cat> 概念:

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 开始)

以下为真:

  • t <=> uu <=> 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), and
  • 如果 Cat 可以转换为 std::strong_ordering,则 TU 符合 std::totally_ordered_with<T, U> 概念。

[edit] 相等性保持

标准库概念的 requires 表达式 中声明的表达式必须是 相等性保持的(除非另有说明)。

[edit] 隐式表达式变体

对于某些常量左值操作数是非修改的表达式使用的 requires 表达式 还需要 隐式表达式变体

[edit] 另请参阅

指定运算符 == 是等价关系
(概念) [edit]
指定类型上的比较运算符会产生一个全序
(概念) [edit]