我正在学习 C++ 中的运算符重载,我看到了,==并且!=只是一些可以为用户定义类型定制的特殊函数。不过,我担心的是,为什么需要 两个单独 的定义?我认为如果a == b为真,则a != b自动为假,反之亦然,并且没有其他可能性,因为根据定义,a != b是!(a == b)。我无法想象在任何情况下这是不正确的。但也许我的想象力有限,或者我对某些事情一无所知?
==
!=
a == b
a != b
!(a == b)
我知道我可以根据另一个来定义一个,但这不是我要问的。我也不是在问按值或按身份比较对象之间的区别。或者两个对象是否可以同时相等和不相等(这绝对不是一个选择!这些东西是互斥的)。我要问的是:
在任何情况下,询问两个对象是否相等确实有意义,但询问它们 不 相等是没有意义的?(无论是从用户的角度,还是从实施者的角度)
如果没有这种可能性,那么到底为什么 C++ 将这两个运算符定义为两个不同的函数?
您 不 希望语言自动重写a != b为!(a == b)whena == b返回 a 以外的内容bool。您可能会这样做有几个原因。
bool
您可能有表达式构建器对象,其中a == b不会也不打算执行任何比较,而只是构建一些表示a == b.
您可能有惰性评估,其中a == b不打算直接执行任何比较,而是返回某种lazy<bool>可以bool在以后隐式或显式转换为实际执行比较的类型。可能与表达式构建器对象结合使用,以允许在评估之前完成表达式优化。
lazy<bool>
您可能有一些自定义optional<T>模板类,其中给定可选变量t和u,您希望允许t == u,但使其返回optional<bool>。
optional<T>
t
u
t == u
optional<bool>
可能还有更多我没有想到的。即使在这些示例中,操作a == b和a != b执行都有意义,但仍然a != b与 不同!(a == b),因此需要单独的定义。