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

标签 c++

作为我上一个问题( 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/

    相关文章:

    C++为对象分配存储而不初始化它?

    c++ - 为什么 C++ 要求仅针对 float、double 或 long double 实例化该复数?

    c++ - 从线性 RGB 转换为 XYZ

    C++检测是否存在按名称接受特定类型的函数

    c++ - 为什么可以将整数类型转换为指针?

    c++ - 通过虚指针访问成员函数的指针

    c++ - 将 std::variant 转换为另一个具有父类(super class)型集的 std::variant

    c++ - 使用引用计数逻辑 C++ 对 API 进行包装

    c++ - MySQL C++ 连接器 : SIGABRT Connecting to Database

    c++ - 显示 C :\Windows\System32\config using C++ 的内容