c++ - 为什么要使用三向比较运算符 (<=>) 而不是双向比较运算符?这有优势吗?
问题描述
#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
。
但是为什么我应该使用三路比较运算符而不是二路运算符(==
, !=
, <
, <=
, >
, >=
)?这对我有好处吗?
解决方案
它可以 在一次操作中确定顺序。
其他运算符需要两次比较。
其他运营商总结:
- 如果
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 <=> b
a
b
推荐阅读
- c# - 我可以通过使用 cookie 自动重新登录到我的 SignInManager 和 UserManager (Identity) -> Asp.Net-Core Identity (Deployed live)
- shell - 为什么 curl 无法使用选项 -i 显示 http 标头
- kubernetes - 从 Kubernetes 集群中的 Worker 节点访问 Pod
- python - python webscraping:您无权访问此资源
- node.js - nodejs中不能同时导入多个tfjs模型库
- r - 如何将图表的确切值放在它上面?
- javascript - 如何在不分配的情况下迭代 Javascript 映射或对象?
- kubectl - JSONPath 以排除包含匹配字符串的值的数组中的项目
- linux - Linux Awesomewm 配置从菜单栏中排除选项
- google-sheets - 从 Google 表格中的一列术语中查找每个唯一的 2 个单词配对