在C++中你需要在两个方向上重载operator ==吗?

heh*_*301 55 c++ operator-overloading

说我正在上课:

class Foo{
public:
  std:string name;
  /*...*/
}/*end Foo*/
Run Code Online (Sandbox Code Playgroud)

我提供了一个重载 operator==

bool operator==(const Foo& fooObj, const std::string& strObj) {
    return (fooObj.name == strObj);
}
Run Code Online (Sandbox Code Playgroud)

我是否还需要反向重新实现相同的逻辑?

bool operator==(const std::string& strObj, const Foo& fooObj) {
    return (strObj == fooObj.name);
}
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 76

如果您想支持字符串在左侧而!=在右侧的比较,您可以这样做.实现不会将参数重新排序为重载==以使其工作.

但是,您可以避免重复实现的逻辑.假设您的运营商应该按预期行事:

inline bool operator==(const std::string& objA, const Foo& objB) {
    return objB == objA; // Reuse previously defined operator
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,你可以.但你绝对不应该. (54认同)
  • @ hehe3301 - 我担心你需要的所有重载都需要明确实现.虽然再一次,身体可以是`!(lhs == rhs)`.这就是为什么`operator <=>`会产生如此多的兴奋.因为它可以减少许多样板. (22认同)
  • 因此理论上可以为`Foo == String`和`String == Foo`实现不同的行为 (8认同)

Mat*_*her 6

是的你是.就像在许多其他语言中一样,C++需要侧面,并且两个不同类型的对象之间的比较将导致根据顺序调用两个不同的比较运算符.

当然,你希望它们保持一致并且不足为奇,所以第二个应该用第一个来定义.

  • 回复:"就像在其他语言中一样":重载工作从一种语言到另一种语言的工作方式完全不同,我认为这种彻底的陈述并不有用. (12认同)