C++20三路比较符operator<=>通过一次定义自动生成所有关系运算符,减少重复代码并提升一致性。它返回strong_ordering、weak_ordering或partial_ordering之一,分别表示强序、弱序和偏序关系,影响等价性和容器行为。使用=default可自动生成按成员声明顺序的字典序比较,但需注意成员顺序、访问权限及性能影响。手动实现适用于复杂逻辑。该特性简化了比较操作,增强了类型安全与代码可维护性。

C++20引入的三路比较符(
operator<=>
operator<=>
C++的三路比较符
operator<=>
std::strong_ordering
std::weak_ordering
std::partial_ordering
具体来说,当你为一个类定义了
operator<=>
#include <compare> // 包含比较类别头文件
#include <string>
#include <iostream>
class MyPoint {
public:
int x;
int y;
// 默认生成三路比较符,它会按成员声明顺序进行字典序比较
// 如果没有特殊需求,这是最简洁的方式
auto operator<=>(const MyPoint&) const = default;
// operator== 也可以默认生成,如果<=>已默认,则通常不需要显式写出
// auto operator==(const MyPoint&) const = default;
};
// 假设我们有一个更复杂的类,需要自定义比较逻辑
class Person {
public:
std::string name;
int age;
// 假设我们希望先按年龄比较,年龄相同再按名字比较
// 并且我们认为同名同龄的人是强等价的
std::strong_ordering operator<=>(const Person& other) const {
if (auto cmp = age <=> other.age; cmp != 0) {
return cmp;
}
return name <=> other.name; // 字符串的<=>会返回strong_ordering
}
// 默认生成operator==,因为我们已经提供了<=>,编译器可以推导
// 也可以显式default
// auto operator==(const Person& other) const = default;
};
int main() {
MyPoint p1{1, 2};
MyPoint p2{1, 3};
MyPoint p3{1, 2};
std::cout << "p1 < p2: " << (p1 < p2) << std::endl; // 编译器自动生成
std::cout << "p1 == p3: " << (p1 == p3) << std::endl; // 编译器自动生成
std::cout << "p2 > p3: " << (p2 > p3) << std::endl; // 编译器自动生成
Person alice1{"Alice", 30};
Person alice2{"Alice", 25};
Person bob{"Bob", 30};
std::cout << "alice1 < alice2: " << (alice1 < alice2) << std::endl; // false (30 not < 25)
std::cout << "alice1 > alice2: " << (alice1 > alice2) << std::endl; // true (30 > 25)
std::cout << "alice1 == bob: " << (alice1 == bob) << std::endl; // false (name different)
std::cout << "alice1 < bob: " << (alice1 < bob) << std::endl; // true (Alice < Bob when age same)
return 0;
}当你定义了
operator<=>
<, <=, >, >=
==
!=
operator==
operator<=>
default
operator==
立即学习“C++免费学习笔记(深入)”;
在我看来,C++20引入三路比较符,与其说是“简化”,不如说是“修正”了长期以来类设计中一个不那么优雅的地方。过去,为一个自定义类型实现所有六个关系操作符,简直是重复劳动的典范。你总得写
operator<
operator>
operator<=
operator<
operator==
有了
operator<=>
default
auto operator<=>(const MyClass&) const = default;
三路比较符的返回类型是其核心概念之一,它们定义了比较结果的“强度”或“完整性”。理解
std::strong_ordering
std::weak_ordering
std::partial_ordering
std::map
std::set
std::strong_ordering
a <=> b == 0
a == b
f(a)
f(b)
Point{1,2}Point{1,2}std::weak_ordering
"Apple"
"Apple"
a == b
a
b
User
userId
userName
userId
CaseInsensitiveString
std::partial_ordering
NaN
NaN
NaN
std::partial_ordering::unordered
NaN
NaN
如何选择? 经验法则是:从
strong_ordering
strong_ordering
weak_ordering
NaN
partial_ordering
std::set
default
operator<=>
auto operator<=>(const MyClass&) const = default;
operator<=>
这意味着,如果你的类有成员
member1
member2
member3
operator<=>
member1
member1
member2
default
operator<=>
operator==
operator==
operator<=>
然而,这种便捷性也带来了一些需要注意的地方:
Employee
department
name
operator<=>
operator==
default
operator<=>
Person
strong_ordering
int
weak_ordering
std::string
operator<=>
总而言之,
default
以上就是C++三路比较符 简化比较操作实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号