# std::less

< cpp‎ | utility‎ | functional

定义于头文件 `<functional>` |  |
template< class T > struct less; |  | (C++14 前)
template< class T = void > struct less; |  | (C++14 起)

进行比较的函数对象。调用类型 `T` 上的 operator< ，除非特化。

### 实现定义的指针上的严格全序

`std::less` 对任何指针类型的特化产生实现定义的严格全序，即使内建的 `<` 运算符不如此。

实现定义的严格全序与比较运算符（ `<=>`、 (C++20 起)`<`、 `>`、 `<=` 及 `>=` ）所施加的偏序一致，并在下列标准函数对象间一致：

- std::less、 std::greater、 std::less_equal 及 std::greater_equal ，当模板实参为指针类型或 void (C++14 起)时

`std::ranges::equal_to`、 `std::ranges::not_equal_to`、 `std::ranges::less`、 `std::ranges::greater`、 `std::ranges::less_equal`、 `std::ranges::greater_equal` 及 std::compare_three_way | (C++20 起)

### 特化

less<void> (C++14) | 实现 x < y 并推导参数和返回类型的函数对象 (类模板特化)

### 成员类型

类型 | 定义
`result_type` (C++17 中弃用)(C++20 中移除) | bool
`first_argument_type` (C++17 中弃用)(C++20 中移除) | `T`
`second_argument_type` (C++17 中弃用)(C++20 中移除) | `T`

这些成员类型由公开继承 std::binary_function<T, T, bool> 获得。 | (C++11 前)

### 成员函数

operator() | 检查第一参数是否小于第二个 (公开成员函数)

## std::less::operator()

bool operator()( const T& lhs, const T& rhs ) const; |  | (C++14 前)
constexpr bool operator()( const T& lhs, const T& rhs ) const; |  | (C++14 起)

检查 `lhs` 是否小于 `rhs` 。

### 参数

lhs, rhs | - | 要比较的值

### 返回值

对于不是指针类型的 `T` ，若 lhs < rhs 则为 true ，否则为 false 。

对于是指针类型的 `T` ，若 `lhs` 在实现定义的严格全序中前驱 `rhs` 则为 true ，否则为 false 。

### 异常

可能抛出实现定义的异常。

### 可能的实现

    constexpr bool operator()(const T &lhs, const T &rhs) const
    {
        return lhs < rhs; // 假定实现使用平坦地址空间
    }

### 示例

    #include <functional>
    #include <iostream>

    template <typename A, typename B, typename C = std::less<>>
    bool fun(A a, B b, C cmp = C{})
    {
        return cmp(a, b);
    }

    int main()
    {
        std::cout
          << std::boolalpha
          << fun(1, 2)   << ' ' // true
          << fun(1.0, 1) << ' ' // false
          << fun(1, 2.0) << ' ' // true
          << std::less<int>{}(5, 5.6)    << ' ' // false ： 5 < 5 （警告：隐式转换）
          << std::less<double>{}(5, 5.6) << ' ' // true  ： 5.0 < 5.6
          << std::less<int>{}(5.6, 5.7)  << ' ' // false ： 5 < 5 （警告：隐式转换）
          << std::less{}(5, 5.6)         << ' ' // true  ： less<void>: 5.0 < 5.6
          << '\n';
    }

输出：

    true false true false true false true

### 参阅

owner_less (C++11) | 提供基于所有者的，共享指针和弱指针的混合类型的排序 (类模板)
greater | 实现 x > y 的函数对象 (类模板)