关于某些C ++ 20功能的文档,我在<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; }
还根据<utility>
:
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 ++ 20中添加的对飞船运算符<=>
的库支持的一部分。这些实用程序适用于<=>
直接使用而不是通过核心语言隐式使用的情况。
一方面,飞船的工作方式是返回一个可以与进行比较的对象0
,从而发出两个对象之间的顺序关系。
(a <=> b) == 0
iff a == b
(a <=> b) < 0
iff a < b
现在,如果您发现自己a <=> b
直接使用或从其他来源处理结果对象,则可以进行比较0
以检查所需的关系。但是,可以说所得到的代码并不是最显而易见的代码。
因此,这些实用程序将添加到库中。它们在那里使代码更具表现力。它们使我们能够编写is_eq(a <=> b)
或is_lt(a <=> b)
查询三向比较的含义。我认为与直接比较相比,它传达的意图要清晰得多0
。同样,只有在极少数情况下,我们可能需要<=>
直接处理结果时,它才可用。
另一组功能用于另一个目的。直接比较整数时,操作数会经历某些整数提升。因此,的结果-1 < 0u
有点不直观false
。这是因为-1
在比较之前将其提升为无符号整数(因为0u
是无符号整数文字)。这回绕成一个非常大的无符号数字,该数字当然不少于0。
为了更好地支持混合比较,添加了这些功能。他们检查了涉及的类型,并在给定涉及的值的情况下给出了数学上正确的结果,而不会由于整数提升过程中发生的值转换而被忽视。与通过比较直接比较<
,std::cmp_less(-1, 0u)
返回true
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句