以下内容:
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)
在这种情况下,当我调用函数时,编译器将如何获得正确的运算符?
答案 0 :(得分: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
,无论如何。返回对self的引用只是惯用(但不是必需的)以允许赋值链接:a = b = c = 0;
本身源于重载运算符的指导原则应该遵循其内置对应物的语义。
答案 1 :(得分:1)