В C++ вам нужно перегрузить operator == в обоих направлениях?

Скажем, я работаю с классом:

class Foo{
public:
  std:string name;
  /*...*/
}/*end Foo*/

и я предоставляю перегрузку для operator==

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

Нужно ли мне также повторять ту же логику в обратном порядке?

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

Ответ 1

Если вы хотите поддерживать сравнения, где строка находится слева, а Foo - справа. Реализация не будет изменять порядок аргументов перегруженному operator== чтобы он работал.

Но вы можете избежать повторения логики реализации. Предполагая, что ваш оператор должен вести себя так, как ожидалось:

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

Ответ 2

Да, да. Как и во многих других языках, C++ принимает стороны, а сравнения между двумя объектами разных типов приведут к вызовам двух разных операторов сравнения в зависимости от порядка.

Конечно, вы хотите, чтобы они были последовательными и неудивительными, поэтому второй должен определяться с точки зрения первого.