2012-12-09 130 views
3

在下面: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;本身源自重载操作符应遵循其内置对应语义的指导原则。

1

你试过了吗?仅通过返回类型重载将是一个编译错误,所以我的猜测是定义的替换了默认值。

+0

只有当模板实际在代码中实例化时,它才会出现编译器错误。否则,它会编译得很好。 – SomeWittyUsername

+0

@icepack是真的,即时假设模板实例化 –

+1

@icepack这是不正确的。如果一个模板总是格格不入,而不管你传递了什么样的模板参数,那么模板可以被拒绝而不需要实例化。这适用于他的类模板,如果默认赋值运算符也会被实例化。 –