当重载等于运算符==时,是否应首先检查引用相等性?

时间:2014-12-03 20:03:43

标签: c++ operator-overloading

当重载operator ==()时,我目前正在执行

bool operator==(const X& lhs, const X& rhs)
{
    return &lhs == &rhs || /* member comparisons ... */;
}

意思是我首先检查对象的引用相等性,然后检查所有成员的相等性。这是“正确”的方式吗?有什么难题或事情需要记住吗?这种实现方式是最有效的方法吗?

1 个答案:

答案 0 :(得分:4)

自我比较通常很少见,除非你是一个不可变的内部pImpl,通常只在常规包装器==碰撞后通过unordered_容器中的std::hash进行比较,或者某事类似。

针对罕见病例进行优化往往是个坏主意。它增加了代码的复杂性,并增加了测试开销。

如果比较昂贵或无限昂贵,则可能存在异常,因此在开始时失败的指针比较的成本是微不足道的。另一个例外是自我比较非常昂贵,几乎自我(几乎同样昂贵)非常罕见,而有时会进行自我比较。

简短的回答是,保持你的代码简单,担心大订单爆炸,不要不必要地悲观,并在实际注意到性能问题后进行优化(即使它只是"哇,那是慢"或蒙特卡罗分析。)