Зачем перегружать операторы, как свободные функции, а не функции-члены? C++

Собственно, читаю про перегрузку операторов и наткнулся на два способа перегрузки операторов:

  1. Как функция-член класса
  2. Как свободная функция

Так вот сам вопрос, зачем перегружать операторы как свободные функции? Ведь из свободной функции мы не можем получить доступ к приватным полям без геттеров, разве этот способ не менее эффективный, для чего он нужен и в каких случаях его использовать предпочтительнее, чем перегрузка как функции-члена?


Ответы (2 шт):

Автор решения: Harry

Ну, простейший пример. Допустим, некий класс, скажем, для больших чисел длинной арифметики Int.

Если определим оператор + для обычных чисел внутри класса, то

Int a;
Int b = a + 2;

будет работать. А

Int a;
Int b = 2 + a;

уже нет. Потому что первым аргументом при операторе-члене всегда идет объект класса. Так что вы просто не сможете написать оператор, в котором первым идет не объект класса.

А для свободного - можно написать и так, и эдак...

→ Ссылка
Автор решения: ТарасПрогер

Одна из причин по которой для бинарных операторов свободные функции могут оказаться предпочтительными — это симметрия. Часто желательно, чтобы если корректным выражением является x@y, то корректным выражением было бы и y@x для любых допустимых типов. Для свободных функций мы можем выбирать произвольный тип первого операнда, когда как в случае функции-члена мы этого лишены.

Как говорит С. Мэейрс, лучше делать функцию свободную, чем дружественную, так как свободная обычная функция дает гарантию неприкосновенности к внутренним сокрытым данным.

→ Ссылка