以下代码无法在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==
添加了一条指令,因此效率较低。这导致一些程序员尽职尽责地写出他们复杂的!=
表达式,多年来我修复了由不匹配的运算符导致的一些错误。
这种强制措施是为两个运营商写一个过早/遗留优化的案例,还是有一个好的,可靠的,实际的理由来做这个代码倍增,我只是在某种程度上错过了?
答案 0 :(得分:0)
我会说缺少一些相反的压倒性证据,它纯粹是过早的优化(甚至不是遗留的 - 我怀疑它是否有充分的理由,至少在接近C ++时间框架的任何事情上)。
对于它的价值,C ++标准的第20.2.1节定义了<utility>
中的一些重载,这些重载将基于!=
和{{1}为您提供operator==
},>
,>=
全部基于<=
。
答案 1 :(得分:-1)
为什么不使用它:
bool f(const A& lhs, const A& rhs) { return !(lhs == rhs); }