3

在下面的 :

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)

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

4

2 回答 2

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;

于 2012-12-09T14:04:29.377 回答
1

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

于 2012-12-09T09:07:10.803 回答