Могут ли операторы присваивания C ++ быть свободными функциями? - PullRequest
18 голосов
/ 22 июня 2010

Я пытаюсь что-то вроде этого:

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

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

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

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

Ответы [ 2 ]

24 голосов
/ 22 июня 2010

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

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

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

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

0 голосов
/ 22 июня 2010

Не может.

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

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

...