== 和 != 是否相互依赖?

新手上路,请多包涵

我正在学习 C++ 中的运算符重载,我看到 ==!= 只是一些可以为用户定义类型定制的特殊函数。不过,我担心的是,为什么需要 两个单独 的定义?我以为如果 a == b 为真,那么 a != b 自动为假,反之亦然,也没有其他可能,因为根据定义, a != b!(a == b) 。我无法想象在任何情况下这是不正确的。但也许我的想象力有限,或者我对某些事情一无所知?

我知道我可以根据另一个来定义一个,但这不是我要问的。我也不是在问按值或按身份比较对象之间的区别。或者两个对象是否可以同时相等和不相等(这绝对不是一个选择!这些东西是互斥的)。我要问的是:

在任何情况下,询问两个对象是否相等确实有意义,但询问它们 相等是没有意义的? (无论是从用户的角度,还是从实施者的角度)

如果没有这种可能性,那么究竟为什么 C++ 将这两个运算符定义为两个不同的函数?

原文由 BarbaraKwarc 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 529
2 个回答

You would not want the language to automatically rewrite a != b as !(a == b) when a == b returns something other than a bool .您可能会这样做有几个原因。

您可能有表达式构建器对象,其中 a == b 不会也不打算执行任何比较,而只是构建一些表示 a == b 的表达式节点。

您可能有惰性评估,其中 a == b 不会也不打算直接执行任何比较,而是返回某种 lazy<bool> 可以转换为 bool 在稍后的某个时间隐式或显式地实际执行比较。可能与表达式构建器对象结合使用,以允许在评估之前完成表达式优化。

您可能有一些自定义的 optional<T> 模板类,其中给定可选变量 tu ,您想允许 t == u 、make itefcd1返回 optional<bool>

可能还有更多我没有想到的。 And even though in these examples the operation a == b and a != b do both make sense, still a != b isn’t the same thing as !(a == b) ,因此需要单独的定义。

原文由 user743382 发布,翻译遵循 CC BY-SA 3.0 许可协议

在任何情况下,询问两个对象是否相等确实有意义,但询问它们不相等是没有意义的? (无论是从用户的角度,还是从实施者的角度)

这是一种意见。也许不是。但是语言设计者并不是无所不知的,他们决定不限制那些可能提出可能有意义的情况的人(至少对他们来说)。

原文由 Benjamin Lindley 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏