Имея следующий код, почему первое задание не вызывает шаблон operator=
в Foo
, но второй делает? Что здесь происходит? Есть ли сгенерированный компилятором один для первого присвоения, даже если пользовательский шаблон существует?с использованием оператора присваивания шаблона
#include <iostream>
using namespace std;
struct UberFoo { };
struct Foo : public UberFoo
{
template<typename T> void operator=(const T& v) { cout << "const T&" << endl; Set(v); }
template<typename T> void operator=(T& v) { cout << "T&" << endl; return Set(v); }
virtual void Set(const Foo&) { cout << "Foo::Set(const Foo&)" << endl; }
virtual void Set(const UberFoo&) { cout << "Foo::Set(const UberFoo&)" << endl; }
};
struct Bar : public Foo
{
virtual void Set(const Foo&) { cout << "Bar::Set(const Foo&)" << endl; }
virtual void Set(const UberFoo&) { cout << "Bar::Set(const UberFoo&)" << endl; }
};
int main()
{
Bar a, b;
Foo & pa = a;
const Foo& rb = b;
const UberFoo & urb = b;
cout << "First" << endl;
pa = rb;
cout << endl << "Second" << endl;
pa = urb;
return 0;
}
Я знаю, что оператор присваивания должен возвращать Ref для себя (чтобы сделать цепочку возможной), но это не та точка – relaxxx
Да, оператор назначения копирования всегда определен, если явно не удалено. Если вы его не определите, компилятор будет. –