CRTP и оператор по умолчанию

В следующих :

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)

В этом случае, когда я вызываю функцию, как компилятор получит правильный оператор?

3

Решение

Если вы объявите любой метод, который может передать оператор присваивания:

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; что само по себе вытекает из директивы, согласно которой перегруженные операторы должны следовать семантике своих встроенных аналогов.

3

Другие решения

Ты пытался? Перегрузка только по типу возвращаемого значения будет ошибкой компиляции, так что я предполагаю, что определенная заменяет замену по умолчанию.

1

По вопросам рекламы [email protected]