2017年11月11日,ISO C ++委员会采纳了 Herb Sutter提出的<=>“太空飞船”三向比较运算符的建议,将其作为C ++ 20中新增的功能之一。在名为“ 一致比较”的论文中,萨特,莫拉尔和布朗展示了新设计的概念。有关提案的概述,请参见以下文章的摘录:
表达一个<=> b返回,其比较的对象<0如果A <B ,比较> 0如果A> B,并且比较== 0如果a和b相等/当量。
常见情况:要使用成员语义为类型X和Y编写所有比较,只需编写:
auto X::operator<=>(const Y&) =default;
晚期病例:要写出你的类型所有比较X型Ÿ,只写操作<=>,需要一个Ÿ,可以使用
=默认获得按成员语义如果需要的话,并返回相应的类别类型:
- 如果您的类型自然支持<,则返回_ordering,我们将有效地生成对称<,>,<=,> =,==和
!=;否则返回_equality,我们将高效地生成对称==和!=。
- 返回strong_如果你的类型一个== b意味着F(一)== F(B) (可替代性,其中˚F只读取比较隐状态是访问使用公共常量成员),否则返回
weak_。
比较类别
将五个比较类别定义为std::
类型,每个类别具有以下预定义值:
+--------------------------------------------------------------------+
| | Numeric values | Non-numeric |
| Category +-----------------------------------+ |
| | -1 | 0 | +1 | values |
+------------------+------+------------+---------------+-------------+
| strong_ordering | less | equal | greater | |
| weak_ordering | less | equivalent | greater | |
| partial_ordering | less | equivalent | greater | unordered |
| strong_equality | | equal | nonequal | |
| weak_equality | | equivalent | nonequivalent | |
+------------------+------+------------+---------------+-------------+
这些类型之间的隐式转换定义如下:
strong_ordering
与值{ less
,equal
,greater
}隐式转换为:
weak_ordering
用值{ less
,equivalent
,greater
}
partial_ordering
用值{ less
,equivalent
,greater
}
strong_equality
用值{ unequal
,equal
,unequal
}
weak_equality
用值{ nonequivalent
,equivalent
,nonequivalent
}
weak_ordering
与值{ less
,equivalent
,greater
}隐式转换为:
partial_ordering
用值{ less
,equivalent
,greater
}
weak_equality
用值{ nonequivalent
,equivalent
,nonequivalent
}
partial_ordering
与值{ less
,equivalent
,greater
,unordered
}隐式转换为:
weak_equality
用值{ nonequivalent
,equivalent
,nonequivalent
,nonequivalent
}
strong_equality
值{ equal
,unequal
}隐式转换为:
weak_equality
值{ equivalent
,nonequivalent
}
三向比较
该<=>
令牌介绍。在旧的源代码中,字符序列<=>
标记为<= >
。例如,X<&Y::operator<=>
需要添加一个空格以保留其含义。
可重载运算符<=>
是三向比较函数,并且具有高于<
和低于的优先级<<
。它返回可以与文字进行比较的类型,0
但允许其他返回类型,例如支持表达式模板。<=>
用该语言和标准库定义的所有运算符均返回上述5个运算符之一std::
种比较类别类型之一。
对于语言类型,提供了以下内置的<=>
相同类型比较。除非另有说明,否则均为constexpr。不能使用标量提升/转换来异构调用这些比较。
- 对于
bool
,整数和指针类型,<=>
返回strong_ordering
。
- 对于指针类型,允许使用不同的cv限定词和派生基转换来调用同构内置函数
<=>
,并且内置异类函数operator<=>(T*, nullptr_t)
。指向相同对象/分配的指针的比较仅是常量表达式。
- 对于基本浮点类型,
<=>
返回partial_ordering
可以通过将参数扩展为更大的浮点类型来异构和。
- 对于枚举,
<=>
返回与枚举的基础类型相同的<=>
。
- 对于
nullptr_t
,<=>
收益strong_ordering
始终为equal
。
- 对于可复制阵列,
T[N] <=> T[N]
返回相同类型T
的<=>
和执行辞书的elementwise比较。没有<=>
其他数组。
- 因为
void
没有<=>
。
为了更好地了解此操作员的内部工作原理,请阅读原始文章。这就是我使用搜索引擎发现的内容。