Правильный способ перегрузки двоичных реляционных операторов в С++

Каков правильный/канонический способ перегрузки двоичных реляционных операторов в C++?

Лучше ли использовать функции-члены или функции, свободные от friend?

Например:

class X {
 public:
  ...

  // Use member function overloads
  bool operator==(const X& rhs) const { 
    return m_text == rhs.m_text; 
  }

 private:
  std::string m_text;
};

или:

class X {
 public:
  ...

  // Use friend free function overloads
  friend bool operator==(const X& lhs, const X& rhs) { 
    return lhs.m_text == rhs.m_text; 
  }

 private:
  std::string m_text;
};
2
10 нояб. '16 в 21:04
источник поделиться
2 ответов

Единственное, о чем вы должны знать, - это неявные преобразования.

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

В других случаях я полагаю, что это скорее вопрос стиля.

3
10 нояб. '16 в 21:08
источник

Это не имеет большого значения, за исключением того, что

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

    X x("hello");
    string s("hello");
    assert(s == x);
    

    вам нужен нечлен.

  • если вы реализуете все бинарные реляционные операторы, это потенциально большое увеличение площади вашего класса.

    Обычно я предпочитаю, чтобы этот вид вспомогательного интерфейса оставался отдельно от логики основного класса, где это возможно (если, конечно, основной задачей вашего класса является сравнение).

    Использование сторонних операторов и минимальный публичный интерфейс, возможно, даже лучше.

3
10 нояб. '16 в 21:15
источник

Посмотрите другие вопросы по меткам или Задайте вопрос