В следующих :
template<typename Derived>
class Base:
{
inline Derived& operator=(const Base<Derived>& x);
}
Удаляет ли это объявление оператор по умолчанию для копирования или у меня есть два оператора:
inline Derived& operator=(const Base<Derived>& x);
// (declared by me)
А ТАКЖЕ
inline Base<Derived>& operator=(const Base<Derived>& x);
// (declared by the compiler)
В этом случае, когда я вызываю функцию, как компилятор получит правильный оператор?
Если вы объявите любой метод, который может передать оператор присваивания:
XXX Foo::operator=(Foo&);
XXX Foo::operator=(Foo const&);
XXX Foo::operator=(Foo volatile&);
XXX Foo::operator=(Foo const volatile&);
тогда компилятор не будет генерировать версию по умолчанию Foo& operator=(Foo const&);
,
Обратите внимание, что тип возвращаемого значения полностью бесплатный, как и для других методов. Вы могли бы использовать void
, bool
, что бы на самом деле. Просто идиоматический (но не обязательно) возвращать ссылку на себя, чтобы позволить цепочка назначений: a = b = c = 0;
что само по себе вытекает из директивы, согласно которой перегруженные операторы должны следовать семантике своих встроенных аналогов.
Ты пытался? Перегрузка только по типу возвращаемого значения будет ошибкой компиляции, так что я предполагаю, что определенная заменяет замену по умолчанию.