0

这是来自有效 C++ 第 2 版 scott meyers 的第 16 项(第 70 页)

作者没有太多解释地写道,当基类运算符 = 以下列方式调用时

Base::operator=(rhs);

一些编译器(尽管错误地)拒绝这个,如果它operator =由编译器生成的(见第 45 条)所以更好地使用

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

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

但在最初的问题中,编译器拒绝它,因为它是由编译器生成的(必须是公开的)

对此的任何帮助(链接)都会有所帮助。(谷歌这些类型的问题很难)

4

1 回答 1

3

但在最初的问题中,编译器拒绝它,因为它是由编译器生成的(必须是公开的)

也许我明白你想要什么。

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

关于私有赋值运算符。第 45 条说,如果基类赋值运算符设为私有,则编译器无法为派生类生成赋值运算符,因为编译器生成的赋值运算符依赖于基类赋值运算符。在这种情况下,您将不得不手动为派生类编写赋值运算符,或者在没有赋值运算符的情况下保留派生类。

于 2011-04-24T18:58:47.383 回答