# std::cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal, cmp_greater_equal

< cpp‎ | utility

定义于头文件 `<utility>` |  |
template< class T, class U > constexpr bool cmp_equal( T t, U u ) noexcept; | (1) | (C++20 起)
template< class T, class U > constexpr bool cmp_not_equal( T t, U u ) noexcept; | (2) | (C++20 起)
template< class T, class U > constexpr bool cmp_less( T t, U u ) noexcept; | (3) | (C++20 起)
template< class T, class U > constexpr bool cmp_greater( T t, U u ) noexcept; | (4) | (C++20 起)
template< class T, class U > constexpr bool cmp_less_equal( T t, U u ) noexcept; | (5) | (C++20 起)
template< class T, class U > constexpr bool cmp_greater_equal( T t, U u ) noexcept; | (6) | (C++20 起)

比较二个整数 `t` 与 `u` 的值。不同于内建比较运算符，负有符号整数始终比较小于（且不等于）无符号整数：该比较相对于有损整数转换是安全的。

    -1 > 0u; // true
    std::cmp_greater(-1, 0u); // false

若 `T` 或 `U` 不是有符号或无符号整数类型（包括标准整数类型与扩展整数类型），则为编译时错误。

### 参数

t | - | 左侧参数
u | - | 右侧参数

### 返回值

1) 若 `t` 等于 `u` 则为 true 。
2) 若 `t` 不等于 `u` 则为 true 。
3) 若 `t` 小于 `u` 则为 true 。
4) 若 `t` 大于 `u` 则为 true 。
5) 若 `t` 小于或等于 `u` 则为 true 。
6) 若 `t` 大于或等于 `u` 则为 true 。

### 可能的实现

    template< class T, class U >
    constexpr bool cmp_equal( T t, U u ) noexcept
    {
        using UT = std::make_unsigned_t<T>;
        using UU = std::make_unsigned_t<U>;
        if constexpr (std::is_signed_v<T> == std::is_signed_v<U>)
            return t == u;
        else if constexpr (std::is_signed_v<T>)
            return t < 0 ? false : UT(t) == u;
        else
            return u < 0 ? false : t == UU(u);
    }

    template< class T, class U >
    constexpr bool cmp_not_equal( T t, U u ) noexcept
    {
        return !cmp_equal(t, u);
    }

    template< class T, class U >
    constexpr bool cmp_less( T t, U u ) noexcept
    {
        using UT = std::make_unsigned_t<T>;
        using UU = std::make_unsigned_t<U>;
        if constexpr (std::is_signed_v<T> == std::is_signed_v<U>)
            return t < u;
        else if constexpr (std::is_signed_v<T>)
            return t < 0 ? true : UT(t) < u;
        else
            return u < 0 ? false : t < UU(u);
    }

    template< class T, class U >
    constexpr bool cmp_greater( T t, U u ) noexcept
    {
        return cmp_less(u, t);
    }

    template< class T, class U >
    constexpr bool cmp_less_equal( T t, U u ) noexcept
    {
        return !cmp_greater(t, u);
    }

    template< class T, class U >
    constexpr bool cmp_greater_equal( T t, U u ) noexcept
    {
        return !cmp_less(t, u);
    }

### 注解

这些函数不能用于比较枚举（包括 `std::byte` ）、 char 、 char8_t 、 char16_t 、 char32_t 、 wchar_t 及 bool 。

### 示例

| 本节未完成 原因：暂无示例