作为我上一个问题( Does overriding the operator == for a class automatically override the operator != )的后续,
是否有一种场景,您可以覆盖 == 和 != 运算符而不是彼此的否定,
其中否定将被定义为:
(!(a == b)) == (a != b)
或者(a == b) == (!(a != b))
最佳答案
不,广义上。斯捷潘诺夫会说,如果你不遵循这个逻辑规则,那么你就会得到你应得的。这就是为什么在 C++20 中,默认情况下它们会像他想要的那样由彼此定义。
实际上,是的,至少有两种情况。
如评论中所述。逻辑不一致并不完全在
==
之间和 !=
,但它是相关的:你可以做 a = b; assert( a != b);
或有 assert( a != a )
.==
和 !=
创建两个独立的表达式。从逻辑上讲,它们应该仍然是对立的,但不是因为它们是简单的 bool 值。看看 Boost.Phoenix 或 Boost.Spirit。如果语言强制为这些操作返回 bool 并且一个作为另一个的否定,这些库将是不可能的。 在这两种情况下,您都可以重新解释情况以“恢复”逻辑规则。例如 1) 你可以说一旦你的系统中有一个 NaN 程序就不再处于逻辑状态。 2) 你可以说“表达式”
a != b
也应该由 !(a == b)
生成即使它们不是立即 bool 值。所以,即使语言允许,你也不应该玩弄逻辑规则。
还有一种说法是,有时检查不平等应该比检查平等更快,反之亦然,作为单独实现它们的借口,这可能导致逻辑不一致。
考虑到 C++ 基础的逻辑运算的短路,并且应该是构建在 C++ 之上的任何系统,这是无稽之谈。
关于c++ - 是否存在合理的情况,其中 == 运算符不是 != 的否定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66960595/