2011-04-24 78 views
0

这是从有效C++第二版斯科特迈尔斯(第70页)呼叫操作员的衍生自

作者写道没有太多的解释是,当基类操作者=被称为以如下方式

的项目16内=
Base::operator=(rhs); 

一些编译器(尽管不正确地)拒绝此,如果是由编译器产生的operator =(见项目45),以便更好地利用

static_cast<base&>(*this) = rhs; 

在第45项他提到,如果基类operator =是私有的,派生类=无权调用它。

,但原来的问题编译器拒绝它,因为它是由编译器生成的(这必须是公共的)

任何帮助(链接)这将是有益的。 (其很难谷歌这些类型的问题)

+2

帮助什么,到底是什么?这本书似乎非常明确和直接。你有什么问题? – abelenky 2011-04-24 18:13:55

+0

如果您正在处理类层次结构,最好不要使用赋值。 – 2011-04-24 18:46:20

+0

@chris感谢您的编辑。 – Amar 2011-04-26 06:16:51

回答

3

但原来的问题编译器 拒绝它,因为它产生由编译器 (这必须是公共的)

也许我明白了什么你要。

编译器生成的赋值运算符变为公共。但第16项不是关于访问级别。这是static_cast<base&>(*this)是破解编译器的解决方法。在第16项中,Scott Meyers说当编译器生成基类赋值操作符时可能需要解决方法。顺便说一句,自第二版发布以来,发生了很大的变化。第3版不再提及解决方法。

关于私人指派操作员。第45项说,如果基类赋值运算符是私有的,那么编译器不能为派生类生成赋值运算符,因为编译器生成的赋值运算符依赖于基类赋值运算符。在这种情况下,您必须手动为派生类编写赋值运算符,或者不使用赋值运算符而离开派生类。

+0

看起来像static_cast (* this)只是一个破解编译器的解决方法。它与公共/私人=运营商无关。关于引用第45项中的第16项,书是错误的,反之亦然。 – Amar 2011-04-26 06:14:58