【问题标题】:Does overriding the operator == for a class automatically override the operator != [duplicate]覆盖运算符 == 是否会自动覆盖运算符 != [重复]
【发布时间】:2021-04-05 20:14:27
【问题描述】:

或者换句话说,这两个块对于编译器来说是否相等:

if (a!=b){
// do something
}
if (!(a==b)){
// do something
}

【问题讨论】:

  • 不,但从语义上讲,您的运算符!= 应该只实现为 return !operator==(rhs);(反之亦然)
  • 或者类似地,它是否也会覆盖(a<=b),因为它可以简化为(a<b || a==b)
  • 有没有一种场景可以实现这两个运算符而不直接依赖另一个运算符? (当然你不需要对它们进行功能性编程来检查是否相等,但是它的应用程序是什么)
  • Boost.Lambda 在 C++11 之前使用运算符重载将 lambda 函数组合在一起。在该库中,所有运算符重载都返回一个特殊的函子对象,==!= 都是独立定义的(即,在其参数上委托给各自的运算符)

标签: c++


【解决方案1】:

没有。我们可以test this easily

#include <iostream>

class C {};

bool operator==(C, C) { return true; }

int main() {
  C a, b;
  std::cout << (a != b) << std::endl;
  return 0;
}

产生(在 gcc 上)

.code.tio.cpp: In function ‘int main()’:
.code.tio.cpp:9:19: error: no match for ‘operator!=’ (operand types are ‘C’ and ‘C’)
   std::cout << (a != b) << std::endl;

【讨论】:

    【解决方案2】:

    运算符重载只会给你你想要的,所以重载== 不会影响!=。所以(a != b)(!(a == b))是不一样的。

    但是,好的做法是同时超载两者以避免混淆。

    【讨论】: