Оператор перегрузки = как нечлен

В соответствии с ответами на этот поток operator= не может быть перегружен как функция, не являющаяся членом. Так, например, следующее делает компилятор очень сердитым:

class MyClass
{
    // ...
};

MyClass& operator=(MyClass& Left, MyClass& Right)
{
    // ...
}

Почему это? У меня есть контейнерный класс с геттерами и сеттерами, поэтому функция-член не нужна, и она разрушит инкапсуляцию. Один из ответов на вышеупомянутый поток сказал, что он должен удостовериться, что "значение L принимается как его первый операнд", но я не совсем понимаю, что это значит. Может кто-нибудь прояснить?

Кроме того, существуют случаи operator=, operator(), operator[] и operator-> "oddball"...? Или я должен реализовать все перегруженные операторы как функции-члены...? (Я знаю, что законно делать иначе, но я ищу лучшую практику.)

Ответ 1

Если ваш класс не имеет оператора присваивания (как члена), компилятор генерирует его по умолчанию, так же как он генерирует конструктор копирования, если вы его не предоставляете.

Поэтому он будет "сердиться", если позже попытается определить оператор назначения, не являющийся членом. Тогда будет два!

Ответ 2

Почему это?

Если вы не объявите один, компилятор объявит operator= в вашем классе с сигнатурой operator= (C&, C&) или operator= (C&, const C&).

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

Затем вы, вероятно, будете лоббировать дополнительные правила для:

  • Притвориться, что компилятор не объявлен operator=, если объявленный пользователь является видимым, как если бы не член operator= скрывал член operator=
  • сделать ваш пользователь объявленным назначением лучшим совпадением во время перегрузки.

Оба варианта осложнят правила, которые уже чрезвычайно сложны, добавив специальный случай только для operator=.

Немногие хотят поехать туда.

А также вы не выставили законное использование этой функции.

Или любое разумное использование вообще.

Правила С++ становятся еще более сложными, когда может быть продемонстрирован некоторый разумный пример использования.