一:概述
在 C++20 中,引入了一个新的比较运算符 <=>。表达式形如 a <=> b,它的返回值不是简单的 bool,而是一个"比较结果对象"。(比较类别 --- comparison category object),根据 a 与 b 的大小/相等关系,返回不同结果。具体来说:如果 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';
}