定义运算符的实际原因!=

时间:2014-01-21 04:29:53

标签: c++ operators comparison-operators

以下代码无法在GCC下编译,因为 定义operator==但未定义operator!=

struct A {
    unsigned int m_i;
    bool operator == (const A& rhs) const { return m_i == rhs.m_i; }
};

bool f(const A& lhs, const A& rhs) { return lhs != rhs; }

显然它想要

bool operator != (const A& rhs) const { return !(operator==(rhs)); }

bool operator != (const A& rhs) const { return m_i != rhs.m_i; }

常识似乎是因为!operator==添加了一条指令,因此效率较低。这导致一些程序员尽职尽责地写出他们复杂的!=表达式,多年来我修复了由不匹配的运算符导致的一些错误。

这种强制措施是为两个运营商写一个过早/遗留优化的案例,还是有一个好的,可靠的,实际的理由来做这个代码倍增,我只是在某种程度上错过了?

2 个答案:

答案 0 :(得分:0)

我会说缺少一些相反的压倒性证据,它纯粹是过早的优化(甚至不是遗留的 - 我怀疑它是否有充分的理由,至少在接近C ++时间框架的任何事情上)。

对于它的价值,C ++标准的第20.2.1节定义了<utility>中的一些重载,这些重载将基于!=和{{1}为您提供operator== },>>=全部基于<=

答案 1 :(得分:-1)

为什么不使用它:

bool f(const A& lhs, const A& rhs) { return !(lhs == rhs); }