C++ 定义运算符的实际原因=

C++ 定义运算符的实际原因=,c++,operators,comparison-operators,C++,Operators,Comparison Operators,以下代码将无法在GCC下编译,因为它确实定义了运算符==,但没有定义运算符= 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&

以下代码将无法在GCC下编译,因为它确实定义了
运算符==
,但没有定义
运算符=

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)); }

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


这种强迫编写两个操作符的做法是否属于过早/遗留优化,或者是否有一个好的、可靠的、实际的理由来执行我所遗漏的代码加倍?

我想说,如果没有一些压倒性的证据,相反,这纯粹是过早优化(甚至连遗产也没有——我怀疑有没有一个很好的理由,至少在接近C++的时间范围内)。
<> p> >标准值20.2.1定义了<代码> >代码>中的一些重载,它将给你一个<代码> > =>代码>基于<代码>运算符==>代码>和<代码> >代码>,代码> > =>代码>,代码> > p>(甚至连遗产也没有——我怀疑有没有一个很好的理由,至少在接近C++的时间范围内)。 <> p>为什么,C++标准中的20.2.1定义了<代码> >代码>中的一些重载,它将给你一个<代码> > =>代码>基于<代码>运算符==/COD>和“<代码> > /代码>,<代码> > <代码> >代码> < p>为什么不使用这个:

bool f(const A& lhs, const A& rhs) { return !(lhs == rhs); }
为什么不使用这个:

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

请阅读问题:具体地说,我不是问如何修复它,我已经给出了一个例子,你只是省略了
操作符==
操作符。请阅读问题:具体地说,我不是问如何修复它,我已经给出了一个例子,你只是省略了
操作符的
操作符==