Оператор присваивания устанавливает операторы левой стороны равными его правой части, поэтому концептуально типы lhs и rhs должны совпадать.Если ваш оператор присваивания принимает в качестве параметра ссылку, он должен вернуть ссылку:
Foo &operator=(const Foo &f);
Было бы совершенно странно написать:
Foo *operator=(const Foo &f); // this is weird because type of lhs != type of rhs
Теперь вы можете предоставитьверсия operator = (), которая присваивает один Foo * другому:
Foo *operator=(const Foo *f);
, но «большая тройка» или «правило трех» ничего не говорит о назначении указателей.«Правило» гласит, что если вы переопределите любой из {деструктор, оператор присваивания, конструктор копирования}, вам, вероятно, потребуется переопределить все из них, поскольку все они должны иметь дело с одним и тем же набором иваров.Но тогда вы назначаете один объект другому.Присвоение одного указателя другому обычно одинаково, независимо от типа указателя.
Подумайте, что произойдет, если вместо эталонной версии использовать версию оператора присваивания Foo *.: у вас не будет возможности установить два указателя так, чтобы они указывали на один и тот же объект.