Могут ли операторы присваивания С++ быть свободными функциями?

Я пробую что-то вроде этого:

Foo & operator=(Foo & to, const Bar &from);

Но я получаю эту ошибку:

E2239 'operator =(Foo &, const Bar &)' must be a member function

Существуют ли ограничения, по которым операторы могут/не могут быть определены как свободные функции, и если да, то почему?

Ответы

Ответ 1

Оператор присваивания должен быть нестатической функцией-членом и должен иметь ровно один параметр:

Оператор присваивания должен быть реализован нестатической функцией-членом только с одним параметром (С++ 03 13.5.3/1).

operator(), operator[] и operator-> также должны быть реализованы как нестатические функции-члены.

Специфические для класса operator new и operator delete (и их варианты) должны быть реализованы как статические функции-члены (обратите внимание, что они неявно статичны, даже если они не объявлены с ключевым словом static).

Ответ 2

Он не может.

Причина, по-моему, связана с конструктором копирования. Они имеют очень схожую семантику, и вы не можете определить конструктор копии вне класса, как и другой конструктор. Таким образом, они не хотели отделять близнецов далеко друг от друга (чтобы избежать парадоксов близнецов:).

P.S. Какой позор на С++ состоит в том, что вы не можете добавить участника в существующий класс. Для этого нет причины низкого уровня. Если бы это было возможно, вы могли бы отключить зависимости заголовка и cpp, не объявляя частные функции в заголовке определения класса.