重载“==”得到你'!='?

如果我手动重载一个结构==运算符,我是否免费获得!=运算符(大概定义为布尔相反),还是我不得不手动重载它(即使只是return !(this == rhs)

编辑 – 问题不在于我是否可以重载这两个运算符,而是如果我已经重载了相等运算符,是否必须重载不等式。 无论如何,已经给出了很好的答案。

重载operator ==不会给你operator != 。 你必须手动执行,规范的方法是按照!(left == right)operator ==来实现。

运营商的语义不是由标准决定的。 你可以很好地重载operator ==意味着平等,但重载operator !=对于不同的东西,如增加,甚至再次平等(这不是一个好的做法,实际上它应该是灰心的,如果有疑问,做整数…) [请参阅下面的(1)

另外, Boost.Operators可以帮助您为运营商提供规范的实现。 对于operator !=还有std::rel_ops和一个规范实现。

(1)了解更多关于它的信息阅读C ++中运算符重载的三个基本规则。

没有什么是免费的。 你支付你在C ++中使用的(在运算符重载的情况下)。
你只有运营商,你没有更多的重载。

另外,如果你重载==操作符,那么你应该重载!= ,因为你的类的用户会期望可用。

运算符重载 C ++ FAQ应该是一个很好的阅读。


回答更新的问题:

问题不在于我是否可以重载这两个运算符,而是如果我已经重载了相等运算符,是否必须重载不等式。

没有。
没有这样的要求,你必须重载!=如果你需要超载== 。 但是,这是一个很好的做法,你应该重载运算符相互关联。

为什么这是一个很好的做法?
从你class级的用户的angular度来思考。 如果你的类的用户可以使用== (相等标准)来比较你的类的对象,那么他们自然会期望他们应该能够使用!= (非平等标准),这源于事实这两个运营商密切相关,并支持所有内置的tyes。

如果你忽视should而不是超负荷,会发生什么事情!=当你超载时==
如果你的类的用户使用!=他们将得到一个编译错误。
当他们提供==时,他们会皱起眉头,不会提供!= ,他们将不得不调整他们的逻辑来使用==而不是!=

所以你可以忍受它,但准备期待一些皱眉和投诉的不便,不提供用户友好的界面。

您必须重载每个操作员。 !=和==不链接。

事实并非如此,幸好它是这样的。 例如,你可能想要一个结构,其中!= b和a == a都是真的。 他们不是必要的,他们可以是任何你想要的。

提高创造力。 🙂

例如,如果你不知道比较的结果,或者一般不知道,那么a == b和a!= b返回的结果是合理的。

例如: http : //en.wikipedia.org/wiki/Three-valued_logic