C++语言特性32 - 三方比较(C++20)

一:概述

在 C++20 中,引入了一个新的比较运算符 <=>。表达式形如 a <=> b,它的返回值不是简单的 bool,而是一个"比较结果对象"。(比较类别 --- comparison category object),根据 ab 的大小/相等关系,返回不同结果。具体来说:如果 a < b,那么 (a <=> b) < 0;如果 a > b,那么 (a <=> b) > 0;如果 a == b(或等价 / 相等 / 等价关系成立),那么 (a <=> b) == 0。

二:例子

cpp 复制代码
#include <iostream>
 
int main()
{
    static_assert(sizeof(unsigned char) < sizeof(int),
                  "Cannot compare signed and smaller unsigned properly");
    int a = -1;
    int b = 1;
    unsigned int c = 1;
    unsigned char d = 1;
 
    std::cout << std::boolalpha
              << "Comparing two signed values:\n"
                 " -1 == 1 ? " << (a == b) << "\n"
                 " -1 <  1 ? " << (a <  b) << "\n"
                 " -1 >  1 ? " << (a >  b) << "\n"
                 "Comparing signed and unsigned:\n"
                 // may issue different-signedness warning:
                 " -1 == 1 ? " << (a == c) << "\n"
                 // may issue different-signedness warning:
                 " -1 <  1 ? " << (a <  c) << "\n"
                 // may issue different-signedness warning:
                 " -1 >  1 ? " << (a >  c) << "\n"
                 "Comparing signed and smaller unsigned:\n"
                 " -1 == 1 ? " << (a == d) << "\n"
                 " -1 <  1 ? " << (a <  d) << "\n"
                 " -1 >  1 ? " << (a >  d) << '\n';
}
cpp 复制代码
#include <iostream>
 
struct Foo
{
    int n1;
    int n2;
};
 
union Union
{
    int n;
    double d;
};
 
int main()
{
    std::cout << std::boolalpha;
 
    char a[4] = "abc";
    char* p1 = &a[1];
    char* p2 = &a[2];
    std::cout << "Pointers to array elements:\n"
              << "p1 == p2? " << (p1 == p2) << '\n'
              << "p1 <  p2? " << (p1 <  p2) << '\n';
 
    Foo f;
    int* p3 = &f.n1;
    int* p4 = &f.n2;
    std::cout << "Pointers to members of a class:\n"
              << "p3 == p4? " << (p3 == p4) << '\n'
              << "p3 <  p4? " << (p3 <  p4) << '\n';
 
    Union u;
    int* p5 = &u.n;
    double* p6 = &u.d;
    std::cout << "Pointers to members of a union:\n"
              << "p5 == (void*)p6? " << (p5 == (void*)p6) << '\n'
              << "p5 <  (void*)p6? " << (p5 <  (void*)p6) << '\n';
}
相关推荐
Vallelonga2 分钟前
Rust 中 unsafe 关键字的语义
开发语言·rust
AI砖家6 分钟前
前端 JavaScript 异步处理全方案详解:从回调到 Observable
开发语言·前端·javascript
熬夜敲代码的猫9 分钟前
AVL树(C++详解版)
数据结构·c++·算法
思麟呀9 分钟前
C++工业级日志项目(七)日志器核心
linux·开发语言·c++·windows
2401_8734794010 分钟前
如何用IP离线库批量清洗订单IP,自动标注省市区?
开发语言·网络·python
郝学胜_神的一滴13 分钟前
Qt 高级开发 019:从零定制登录窗口按钮、Logo 样式与交互悬浮效果
c++·qt
lcj251115 分钟前
vector的基本使用 + 手搓成员变量 size capacity begin end operator[] reserve扩容 拷贝构造 赋值析构
开发语言·c++·笔记·面试
liulilittle26 分钟前
C++ do_div 宏
c++
GHL28427109027 分钟前
Qt Creator 19.0.0 (Community)下载
开发语言·qt