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没有<=>。
为了更好地了解此操作员的内部工作原理,请阅读原始文章。这就是我使用搜索引擎发现的内容。