- 注册时间
- 2009-2-12
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 22688
- 在线时间
- 小时
|
发表于 2020-3-29 13:39:49
|
显示全部楼层
搜了下, 发现 三路运算符的引入并不是编译器做简单的功能上的加法.
其实是对编译器 关于比较操作符处理的 一次全面革新, https://en.wikipedia.org/wiki/Trichotomy_(mathematics)
三分律: 对于任意的一个实数$x$,一定 有且仅有一种描述成立, $x<0, x=0,x>0$
于是,编译器对所有的比较运算都进行重构了, 比如 $a>b$ 用三路运算符表达就是 $a<=>b >0$
C++20开始, 编译器会为类产生一个默认的 比较成员函数. https://en.cppreference.com/w/cpp/language/default_comparisons
以前要实现一个类的比较操作,需要很繁琐的分别实现 $<,<=,>,>=,=,!=$这六种操作符.
- class CIString {
- string s;
- public:
- friend bool operator==(const CIString& a, const CIString& b) {
- return a.s.size() == b.s.size() &&
- ci_compare(a.s.c_str(), b.s.c_str()) == 0;
- }
- friend bool operator< (const CIString& a, const CIString& b) {
- return ci_compare(a.s.c_str(), b.s.c_str()) < 0;
- }
- friend bool operator!=(const CIString& a, const CIString& b) {
- return !(a == b);
- }
- friend bool operator> (const CIString& a, const CIString& b) {
- return b < a;
- }
- friend bool operator>=(const CIString& a, const CIString& b) {
- return !(a < b);
- }
- friend bool operator<=(const CIString& a, const CIString& b) {
- return !(b < a);
- }
- friend bool operator==(const CIString& a, const char* b) {
- return ci_compare(a.s.c_str(), b) == 0;
- }
- friend bool operator< (const CIString& a, const char* b) {
- return ci_compare(a.s.c_str(), b) < 0;
- }
- friend bool operator!=(const CIString& a, const char* b) {
- return !(a == b);
- }
- friend bool operator> (const CIString& a, const char* b) {
- return b < a;
- }
- friend bool operator>=(const CIString& a, const char* b) {
- return !(a < b);
- }
- friend bool operator<=(const CIString& a, const char* b) {
- return !(b < a);
- }
- friend bool operator==(const char* a, const CIString& b) {
- return ci_compare(a, b.s.c_str()) == 0;
- }
- friend bool operator< (const char* a, const CIString& b) {
- return ci_compare(a, b.s.c_str()) < 0;
- }
- friend bool operator!=(const char* a, const CIString& b) {
- return !(a == b);
- }
- friend bool operator> (const char* a, const CIString& b) {
- return b < a;
- }
- friend bool operator>=(const char* a, const CIString& b) {
- return !(a < b);
- }
- friend bool operator<=(const char* a, const CIString& b) {
- return !(b < a);
- }
- };
复制代码
用了三路运算符之后,就简单了,
- class CIString {
- string s;
- public:
- bool operator==(const CIString& b) const {
- return s.size() == b.s.size() &&
- ci_compare(s.c_str(), b.s.c_str()) == 0;
- }
- std::weak_ordering operator<=>(const CIString& b) const {
- return ci_compare(s.c_str(), b.s.c_str()) <=> 0;
- }
- bool operator==(char const* b) const {
- return ci_compare(s.c_str(), b) == 0;
- }
- std::weak_ordering operator<=>(const char* b) const {
- return ci_compare(s.c_str(), b) <=> 0;
- }
- };
复制代码
https://brevzin.github.io/c++/2019/07/28/comparisons-cpp20/
|
|