【问题标题】:What makes some named Functions/Operators special?是什么让一些命名函数/运算符特别?
【发布时间】:2020-06-01 15:45:34
【问题描述】:

在一些 C++20 features 上记录,我在 <compare> 标头下交叉了一些命名函数和运算符,如下所示:

  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; }

Also&lt;utility&gt;:

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);
}

我们应该了解自定义比较器(或简单比较器)与这些函数之间的区别吗?他们有什么特别之处?

【问题讨论】:

    标签: c++ compare c++20 utility


    【解决方案1】:

    第一组函数是对spaceship operator &lt;=&gt; 的库支持的一部分,已添加到 C++20 中。这些实用程序适用于发现自己直接使用&lt;=&gt; 而不是通过核心语言隐式使用的情况。

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

    • (a &lt;=&gt; b) == 0如果a == b
    • (a &lt;=&gt; b) &lt; 0如果a &lt; b

    现在,如果您发现自己直接使用a &lt;=&gt; b,或者处理来自其他来源的结果对象,您可以与0 进行比较以检查您想要的关系。但是,生成的代码可能不是最容易阅读的。

    所以这些实用程序被添加到库中。他们在那里使代码更具表现力。它们允许我们编写is_eq(a &lt;=&gt; b)is_lt(a &lt;=&gt; b) 来查询三路比较的含义。我认为它传达的意图比与0 的直接比较要清楚得多。同样,它仅适用于我们可能需要直接使用 &lt;=&gt; 的结果的极少数情况。


    另一组函数用于另一个目的。直接比较整数时,操作数会经历某些整数提升。所以-1 &lt; 0u 的结果有点不直观false。这是因为-1 在比较之前被提升为无符号整数(因为0u 是无符号整数文字)。这环绕成一个非常大的无符号数,当然不小于 0。

    为了更好地支持混合比较,添加了这些功能。他们检查所涉及的类型,并在给定所涉及的值的情况下给出数学上正确的结果,而不会由于整数提升期间发生的值转换而偏离轨道。与通过&lt; 直接比较相比,std::cmp_less(-1, 0u) 返回true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-18
      • 2011-11-02
      • 2013-08-06
      • 2011-12-08
      • 2010-10-11
      • 2019-04-10
      • 1970-01-01
      相关资源
      最近更新 更多