C++中的太空船比较运算符

Ram*_*Ram 10 c++ spaceship-operator c++20

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

这个问题旨在了解现实世界中的实际应用,而无需阅读Herb Sutter的罗嗦提议.尽管如此,对提案没有冒犯.

ein*_*ica 13

我会给你三点动力,就在我的头顶:

  1. 这是所有其他运营商相比的共同推广(对于完全有序域): ,>,>=,==,.<= <使用<=>(太空飞船),您可以以完全通用的方式实现这些其他操作.
  2. 它对字符串非常有用:对于特​​定情况,它strcmp()是C标准库中的旧版本.所以 - 对于任何具有词典顺序的东西都很有用,比如矢量或其他有序容器中的东西.
  3. 对于整数,它就是硬件的作用:On x86或者x86_64比较a和b(CMP RAX, RBX)基本上就像减去(SUB RAX, RBX),除非RAX实际没有改变,只有标志受到影响,所以你可以使用"跳上等于/不等于/大于/小于/等." (JE/JNE/JGT/JLT等)作为下一条指令.CMP应该被认为是"太空船比较".

  • @MatteoItalia:"*仅限图书馆的更改更方便.*"但不太有用.没有任何核心语言更改,`= default`比较生成是不可能的.如果没有那个*,那么将用户定义的类型放入模板参数(为C++ 20添加的东西)的能力是不可能的.这与右值参考没什么不同; 你*可能*已经制作了某种语言功能可以关键的标准库类型,但是我们将无法使用它来修复转发. (3认同)
  • @MatteoItalia:1.它不会使语法复杂化。C ++语法有一个模棱两可的问题,这不是其中之一。2.这是更宏大的方案的一部分,该方案将包括大多数类型的编译器生成的[默认比较运算符](http://en.cppreference.com/w/cpp/language/default_comparisons),该类型将是_awesome_。 (2认同)
  • @MatteoItalia:关于第 3 点 - 没有实际意义,与您不需要 &gt;= 的意义相同,因为您有 &gt; 和 =。如果硬件&gt;=,你为什么不能这么说? (2认同)
  • @MatteoItalia:C ++并未发明三向比较太空飞船操作员。其他语言也可以。C ++仅以C ++形式采用它。当我们可以像其他人一样对它进行拼写时,C ++没有理由将它拼写为“ compare”。 (2认同)
  • @MatteoItalia:"*它是一个操作员,因为有人喜欢它的样子,不是因为有一些技术原因导致它无法实现*"如果你想假装是这样,你可以这样做.它没有使我对现有的`compare`函数的说法更加真实.`operator <=>`的优点是不存在与之冲突的现有函数. (2认同)