C++ 是什么使某些命名函数/运算符特别?

C++ 是什么使某些命名函数/运算符特别?,c++,compare,c++20,utility,C++,Compare,C++20,Utility,在一些C++20上编写文档时,我在标题下划过了一些命名函数和运算符,如下所示: 根据: 关于自定义比较器或简单比较器与这些函数之间的区别,我们应该知道什么?它们有什么特别之处?第一组函数是库支持的一部分,添加到C++20中。这些实用程序适用于直接使用而不是通过核心语言隐式使用的情况 一方面,宇宙飞船的工作方式是返回一个可以比较为0的对象,从而表示两个对象之间的顺序关系 如果a==b,则b==0 当a

在一些C++20上编写文档时,我在标题下划过了一些命名函数和运算符,如下所示:

根据:


关于自定义比较器或简单比较器与这些函数之间的区别,我们应该知道什么?它们有什么特别之处?

第一组函数是库支持的一部分,添加到C++20中。这些实用程序适用于直接使用而不是通过核心语言隐式使用的情况

一方面,宇宙飞船的工作方式是返回一个可以比较为0的对象,从而表示两个对象之间的顺序关系

如果a==b,则b==0 当a 因此,这些实用程序被添加到库中。它们是为了使代码更具表现力。它们允许我们写is_eqa b或is_lta b来质疑三方比较的意义。我认为它比直接与0进行比较更清楚地传达了意图。同样,它只适用于少数情况,当我们可能需要直接处理结果时

另一组函数用于另一个目的。直接比较整数时,操作数会经历某些整数提升。因此,-1<0u的结果是一个有点不直观的错误。这是因为-1在比较之前被提升为无符号整数,因为0u是无符号整数文本。这会变成一个非常大的无符号数,当然不小于0


为了更好地支持混合比较,添加了这些函数。他们检查所涉及的类型,并给出一个数学上正确的结果,给定所涉及的值,而不会因为整数提升期间发生的值转换而被跟踪。与通过直接比较相比,第一组函数是库支持的一部分,添加到C++20中。这些实用程序适用于直接使用而不是通过核心语言隐式使用的情况

一方面,宇宙飞船的工作方式是返回一个可以比较为0的对象,从而表示两个对象之间的顺序关系

如果a==b,则b==0 当a 因此,这些实用程序被添加到库中。它们是为了使代码更具表现力。它们允许我们写is_eqa b或is_lta b来质疑三方比较的意义。我认为它比直接与0进行比较更清楚地传达了意图。同样,它只适用于少数情况,当我们可能需要直接处理结果时

另一组函数用于另一个目的。直接比较整数时,操作数会经历某些整数提升。因此,-1<0u的结果是一个有点不直观的错误。这是因为-1在比较之前被提升为无符号整数,因为0u是无符号整数文本。这会变成一个非常大的无符号数,当然不小于0

为了更好地支持混合比较,添加了这些函数。他们检查所涉及的类型,并给出一个数学上正确的结果,给定所涉及的值,而不会因为整数提升期间发生的值转换而被跟踪。与直接比较通过
  constexpr bool is_eq  (partial_ordering cmp) noexcept { return cmp == 0; }
  constexpr bool is_neq (partial_ordering cmp) noexcept { return cmp != 0; }
  constexpr bool is_lt  (partial_ordering cmp) noexcept { return cmp < 0; }
  constexpr bool is_lteq(partial_ordering cmp) noexcept { return cmp <= 0; }
  constexpr bool is_gt  (partial_ordering cmp) noexcept { return cmp > 0; }
  constexpr bool is_gteq(partial_ordering cmp) noexcept { return cmp >= 0; }
template< class T, class U >
constexpr bool cmp_greater_equal( 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);
}