小编典典

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

all

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

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

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

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


阅读 79

收藏
2022-04-24

共1个答案

小编典典

希望语言自动重写a != b!(a == b)whena == b返回 a 以外的内容bool。您可能会这样做有几个原因。

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

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

您可能有一些自定义optional<T>模板类,其中给定可选变量tu,您希望允许t == u,但使其返回optional<bool>

可能还有更多我没有想到的。即使在这些示例中,操作a == ba != b执行都有意义,但仍然a != b与 不同!(a == b),因此需要单独的定义。

2022-04-24