operator==需手动实现深比较:先判空再解引用比内容,裸指针和unique_ptr须显式处理,shared_ptr默认值比较但依赖t的operator==;函数应为const noexcept。

operator== 必须手动实现深比较,编译器不会帮你
默认生成的 operator== 只做逐字节(或逐成员)浅比较,对指针成员而言就是比地址值。哪怕两个对象逻辑上“内容相同”,只要指针指向不同内存块,结果就是 false。这不是 bug,是设计使然——编译器无从知道你希望“指针所指内容相等”才算相等。
深比较的关键:先判空,再解引用比内容
对每个指针成员,必须显式检查是否为 nullptr,再决定是否解引用比较其指向的数据。漏掉空指针检查会导致未定义行为(如解引用空指针崩溃)。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 若指针为
nullptr,另一方也必须为nullptr才算相等 - 若双方都不为空,则需递归或逐字段比较其所指对象的值(而非地址)
- 若指针指向 POD 类型(如
int*),直接比较*lhs_ptr == *rhs_ptr - 若指向自定义类(如
Widget*),需确保该类已正确定义了operator==
std::shared_ptr 成员可直接用 ==,但注意语义
如果指针成员是 std::shared_ptr<t></t>,它重载了 operator==,默认行为是**比较所指对象的值**(即调用 T::operator==),不是比控制块地址。这恰好符合深比较直觉,但前提是 T 的 operator== 本身是深比较的。
- 不要误以为
shared_ptr的==是在比引用计数或控制块地址 - 若需比“是否共享同一对象”,应使用
std::shared_ptr::get() == std::shared_ptr::get() - 裸指针(
T*)和std::unique_ptr<t></t>不提供值比较,必须手动解引用
容易被忽略的点:const 正确性与 noexcept
深比较函数应声明为 const 成员函数,且强烈建议加 noexcept——因为比较操作本不该抛异常,加了之后能参与更多优化(如容器移动时的异常安全路径选择)。
- 错误写法:
bool operator==(const MyClass& other)(缺少const修饰符) - 正确写法:
bool operator==(const MyClass& other) const noexcept - 若比较过程可能抛异常(如调用可能 throw 的
T::operator==),则不能加noexcept,但此时已不属于“常规深比较”范畴
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










