【问题标题】:Why do we need the spaceship <=> operator in C++?为什么我们需要 C++ 中的 spaceship <=> 运算符?
【发布时间】:2018-09-14 14:46:15
【问题描述】:

为什么我们在 C++ 中需要这样的运算符,它在现代 C++ 编程中有何用处?任何可以应用的真实世界代码示例都会有所帮助。

这个问题旨在了解现实世界中的实际应用,而无需阅读 Herb Sutter 的冗长建议。不过这个提议并没有冒犯。

【问题讨论】:

标签: c++ c++20 spaceship-operator


【解决方案1】:

我想给你三点动力:

  1. 这是所有其他比较运算符的通用概括(对于完全有序的域):&gt;&gt;===&lt;=&lt;。使用&lt;=&gt;(宇宙飞船),您可以以完全通用的方式实现这些其他操作。
  2. 对于字符串,它相当于 C 标准库中的旧 strcmp() 函数。所以 - 对于字典顺序检查很有用,例如向量或列表或其他有序容器中的数据。
  3. 对于整数,无论​​如何,这都是硬件所做的:在x86x86_64 比较a 和b (CMP RAX, RBX) 基本上就像减法(SUB RAX, RBX),除了RAX 实际上并没有改变,只有标志受到影响,因此您可以使用“在等于/不等于/大于/小于/等上跳转”。 (JE/JNE/JGT/JLT 等)作为下一条指令。 CMP 应该被视为“宇宙飞船比较”。

【讨论】:

  • @MatteoItalia:1. 语法解析并不复杂。 C++ 语法存在歧义问题,这不是其中之一。 2. 这是一个宏大计划的一部分,其中包括编译器为大多数类型生成的default comparison operators,这将是真棒
  • @MatteoItalia:关于第 3 点 - 没有实际意义,就像你不需要 >= 一样,因为你有 > 和 =。如果硬件确实 >=,为什么你不能这么说?
  • @MatteoItalia:C++ 没有发明 3 路比较宇宙飞船运算符。其他语言做到了。 C++ 只是以 C++ 形式采用它。当我们可以像其他人一样拼写它时,C++ 没有理由拼写它compare
  • @MatteoItalia:“它是一个运算符,因为有人喜欢它的外观,而不是因为某些技术原因导致它无法以其他方式实现”如果你想假装这是这种情况下,你可以这样做。这并没有使我所说的现有compare 函数变得不那么真实。 operator&lt;=&gt; 的优点是没有现有的函数可以与之冲突。
  • @MatteoItalia:“仅库更改更方便。”但用处不大。如果没有任何核心语言更改,= default 比较生成将是不可能的。如果没有 that,则无法将用户定义的类型放入模板参数(为 C++20 添加的东西)。这与右值引用没有什么不同;您本可以制作了某种标准库类型,语言功能可以使用这种类型,但是我们无法使用它来修复转发。
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多