我正在学习 C++ 中的运算符重载,我看到 ==
和 !=
只是一些可以为用户定义类型定制的特殊函数。不过,我担心的是,为什么需要 两个单独 的定义?我以为如果 a == b
为真,那么 a != b
自动为假,反之亦然,也没有其他可能,因为根据定义, a != b
是 !(a == b)
。我无法想象在任何情况下这是不正确的。但也许我的想象力有限,或者我对某些事情一无所知?
我知道我可以根据另一个来定义一个,但这不是我要问的。我也不是在问按值或按身份比较对象之间的区别。或者两个对象是否可以同时相等和不相等(这绝对不是一个选择!这些东西是互斥的)。我要问的是:
在任何情况下,询问两个对象是否相等确实有意义,但询问它们 不 相等是没有意义的? (无论是从用户的角度,还是从实施者的角度)
如果没有这种可能性,那么究竟为什么 C++ 将这两个运算符定义为两个不同的函数?
原文由 BarbaraKwarc 发布,翻译遵循 CC BY-SA 4.0 许可协议
You would not want the language to automatically rewrite
a != b
as!(a == b)
whena == b
returns something other than abool
.您可能会这样做有几个原因。您可能有表达式构建器对象,其中
a == b
不会也不打算执行任何比较,而只是构建一些表示a == b
的表达式节点。您可能有惰性评估,其中
a == b
不会也不打算直接执行任何比较,而是返回某种lazy<bool>
可以转换为bool
在稍后的某个时间隐式或显式地实际执行比较。可能与表达式构建器对象结合使用,以允许在评估之前完成表达式优化。您可能有一些自定义的
optional<T>
模板类,其中给定可选变量t
和u
,您想允许t == u
、make itefcd1返回optional<bool>
。可能还有更多我没有想到的。 And even though in these examples the operation
a == b
anda != b
do both make sense, stilla != b
isn’t the same thing as!(a == b)
,因此需要单独的定义。