首页 > 解决方案 > 为什么要使用三向比较运算符 (<=>) 而不是双向比较运算符?这有优势吗?

问题描述

#include <compare>
#include <iostream>

int main()
{ 
   auto comp1 = 1.1 <=> 2.2;
   auto comp2 = -1 <=> 1;
   std::cout << typeid(comp1).name()<<"\n"<<typeid(comp2).name();
}

输出:

结构 std::partial_ordering
结构 std::strong_ordering

我知道如果操作数具有整数类型,则运算符返回类型为PRvaluestd::strong_ordering。我还知道操作数是否具有浮点类型,该运算符会产生一个PRvalue类型std::partial_ordering

但是为什么我应该使用三路比较运算符而不是二路运算符(==, !=, <, <=, >, >=)?这对我有好处吗?

标签: c++c++20comparison-operatorsspaceship-operator

解决方案


它可以 在一次操作中确定顺序。
其他运算符需要两次比较。

其他运营商总结:

  • 如果a == b是假的,你不知道a < b是否a > b
  • 如果a != b是真的,你不知道是a < b不是a > b
  • 如果a < b是假的,你不知道a == b是否a > b
  • 如果a > b是假的,你不知道a == b是否a < b
  • 如果a <= b是真的,你不知道是a == b不是a < b
  • 如果a >= b是真的,你不知道是a == b不是a > b

一个简洁的副作用是所有其他运算符都可以用 来实现<=>,并且编译器可以为您生成它们。

另一个副作用是,人们可能会对<=>在数学中使用等价箭头感到困惑,自从打字机得到这三个符号以来,它几乎一直存在。(当且仅当且不相等时,我个人对“真实”如何是非常恼火
。)a <=> bab


推荐阅读