CRTP和默认赋值运算符

时间:2012-12-09 08:49:00

标签: c++ c++11 operator-overloading assignment-operator 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)

在这种情况下,当我调用函数时,编译器将如何获得正确的运算符?

2 个答案:

答案 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&);

请注意,返回类型完全免费,与其他方法一样。您可以使用voidbool,无论如何。返回对self的引用只是惯用(但不是必需的)以允许赋值链接a = b = c = 0;本身源于重载运算符的指导原则应该遵循其内置对应物的语义。

答案 1 :(得分:1)

你尝试过吗?仅按返回类型重载将是编译错误,因此我的猜测是定义的那个替换了默认值。