CRTP 和默认分配运算符

CRTP and default assignment operator

本文关键字:运算符 分配 默认 CRTP      更新时间:2023-10-16

在下面:

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)

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

如果声明任何可以传递给赋值运算符的方法:

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;这本身源于重载运算符应遵循其内置对应项的语义的准则。

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