有以下代码,为什么第一个赋值不会在Foo
中调用模板operator=
,但第二个呢?这里发生了什么?即使用户定义的模板存在,是否有编译器为第一个赋值生成的?使用模板赋值运算符
#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;
}
我知道赋值运算符应该返回参考自我(做链接可能),但这不是重点 – relaxxx
是的,一个拷贝赋值运算符始终定义,除非明确地删除。如果你没有定义一个,编译器会。 –