gpt4 book ai didi

c++ - 是否存在合理的情况,其中 == 运算符不是 != 的否定?

转载 作者:行者123 更新时间:2023-12-03 14:46:17 26 4
gpt4 key购买 nike

作为我上一个问题( Does overriding the operator == for a class automatically override the operator != )的后续,
是否有一种场景,您可以覆盖 == 和 != 运算符而不是彼此的否定,
其中否定将被定义为:

(!(a == b)) == (a != b)
或者
(a == b) == (!(a != b))

最佳答案

不,广义上。斯捷潘诺夫会说,如果你不遵循这个逻辑规则,那么你就会得到你应得的。这就是为什么在 C++20 中,默认情况下它们会像他想要的那样由彼此定义。
实际上,是的,至少有两种情况。

  • IEEE 浮点数中的 NaN(非数字)。两个 NaN 不同且不相等。

  • 如评论中所述。逻辑不一致并不完全在 == 之间和 != ,但它是相关的:你可以做 a = b; assert( a != b);或有 assert( a != a ) .
  • 表达式构造,又名表达式模板,又名 DSL。 ==!=创建两个独立的表达式。从逻辑上讲,它们应该仍然是对立的,但不是因为它们是简单的 bool 值。看看 Boost.Phoenix 或 Boost.Spirit。如果语言强制为这些操作返回 bool 并且一个作为另一个的否定,这些库将是不可能的。

  • 在这两种情况下,您都可以重新解释情况以“恢复”逻辑规则。例如 1) 你可以说一旦你的系统中有一个 NaN 程序就不再处于逻辑状态。 2) 你可以说“表达式” a != b也应该由 !(a == b) 生成即使它们不是立即 bool 值。
    所以,即使语言允许,你也不应该玩弄逻辑规则。
    还有一种说法是,有时检查不平等应该比检查平等更快,反之亦然,作为单独实现它们的借口,这可能导致逻辑不一致。
    考虑到 C++ 基础的逻辑运算的短路,并且应该是构建在 C++ 之上的任何系统,这是无稽之谈。

    关于c++ - 是否存在合理的情况,其中 == 运算符不是 != 的否定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66960595/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com