当我尝试学习 C++ 运算符时,我在 cppreference.com 上偶然发现了一个奇怪的比较运算符, *在一个看起来像这样的表中:
“好吧,如果这些是 C++ 中的常用运算符,我最好学习它们”,我想。但我所有试图解开这个谜团的尝试都没有成功。即使在这里,在 Stack Overflow 上我的搜索也没有运气。
<=> 和 C++ 之间有联系吗?
如果有,这个操作员究竟做了什么?
\* 与此同时,cppreference.com 更新了该页面,现在包含有关 <=>
运算符的信息。
原文由 q-l-p 发布,翻译遵循 CC BY-SA 4.0 许可协议
2017 年 11 月 11 日,ISO C++ 委员会采纳了 Herb Sutter 关于 <=> “宇宙飞船” 三路比较运算符 的提议,作为添加到 C++20 的新特性之一。在题为 一致比较 Sutter、Maurer 和 Brown 的论文中,展示了新设计的概念。有关该提案的概述,这里是文章的摘录:
”`
这些类型之间的隐式转换定义如下:
strong_ordering
具有值 {less
,equal
,greater
隐式转换为:}7weak_ordering
有值 {less
,equivalent
,greater
partial_ordering
具有值 {less
,equivalent
,greater
}eastrong_equality
带有值 {unequal
,equal
,unequal
weak_equality
带有值 {nonequivalent
,equivalent
,nonequivalent
} —weak_ordering
具有值 {less
,equivalent
,greater
partial_ordering
带有值 {less
,equivalent
,greater
weak_equality
具有值 {nonequivalent
,equivalent
,nonequivalent
}bpartial_ordering
with values {less
,equivalent
,greater
,unordered
} implicitly converts to:weak_equality
with values {nonequivalent
,equivalent
,nonequivalent
,nonequivalent
}strong_equality
具有值 {equal
,unequal
} 隐式转换为:weak_equality
具有值 {equivalent
,nonequivalent
}三路比较
引入了
<=>
令牌。旧源代码中的字符序列<=>
标记为<= >
。比如X<&Y::operator<=>
需要加一个空格来保留其含义。可重载运算符
<=>
是三路比较函数,优先级高于<
且低于<<
。它返回一个可以与文字比较的类型0
但允许其他返回类型,例如支持表达式模板。在语言和标准库中定义的所有<=>
运算符都返回上述 5 个std::
比较类别类型之一。对于语言类型,提供了以下内置的
<=>
同类型比较。所有都是 constexpr ,除非另有说明。不能使用标量提升/转换异构调用这些比较。bool
、整数和指针类型,<=>
返回strong_ordering
。<=>
,并且有内置的异构operator<=>(T*, nullptr_t)
。只有指向相同对象/分配的指针的比较才是常量表达式。<=>
返回partial_ordering
,并且可以通过将参数扩展为更大的浮点类型来异构调用。<=>
返回与枚举的基础类型相同的<=>
。nullptr_t
,<=>
返回strong_ordering
并且总是产生equal
T[N] <=> T[N]
返回与T
的<=>
相同的类型并执行字典元素比较。其他阵列没有<=>
。void
没有<=>
。为了更好地理解该运算符的内部工作原理,请阅读原始 论文。这正是我使用搜索引擎发现的。