这是来自有效的C ++第2版斯科特迈耶斯的第16项(第70页)
作者在没有太多解释时写道,当以下列方式调用基类operator =时
Base::operator=(rhs);
如果operator =
由编译器生成(参见第45项),某些编译器(尽管不正确)会拒绝此项,以便更好地使用
static_cast<base&>(*this) = rhs;
在第45项中,他提到如果基类operator =
是私有的,派生类=
无权调用它。
但在原始问题中,编译器拒绝它,因为它是由编译器生成的(必须是公共的)
这方面的任何帮助(链接)都会有所帮助。 (很难谷歌这些类型的问题)
答案 0 :(得分:3)
但在原始问题编译器是 拒绝它,因为它是生成的 通过编译器(必须是公共的)
也许我明白你想要什么。
编译器生成的赋值运算符变为公共运算符。但是第16项与访问级别无关。这个static_cast<base&>(*this)
是破解编译器的解决方法。在第16项中,Scott Meyers说当编译器生成基类赋值运算符时可能需要解决方法。顺便说一句,自第2版以来发生了很大变化。第3版不再提及解决方法。
关于私人任务运营商。第45项说如果基类赋值运算符是私有的,那么编译器就不能为派生类生成赋值运算符,因为编译器生成的赋值运算符依赖于基类赋值运算符。在这种情况下,您必须手动为派生类编写赋值运算符,或者在没有赋值运算符的情况下保留派生类。