Могут ли операторы присваивания С++ быть свободными функциями?
Я пробую что-то вроде этого:
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, не объявляя частные функции в заголовке определения класса.