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// 包含比较类别头文件 #include #include 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号