不同作用域下函数重载的可见性问题:编译器是否存在Bug?
这不是编译器Bug,是C++重载解析规则的正常表现
这不是编译器的Bug,完全符合C++的重载解析规则,具体原因拆解如下:
名称查找阶段:
当在Sample2::Compute()中调用ms.GetValue()时,编译器会在Sample类的作用域内查找所有名为GetValue的函数,最终找到两个候选:- 公开的
const double& GetValue() const - 受保护的
double& GetValue()
- 公开的
重载决议阶段:
由于ms是非const的Sample实例,非const成员函数double& GetValue()的匹配优先级更高——它不需要将对象视为const类型,因此会被编译器选为最优匹配。访问权限检查阶段:
选中的double& GetValue()是protected修饰的成员,而Sample2既不是Sample的派生类,也不是它的友元,不符合protected成员的访问规则,因此触发编译错误。
当你删除protected版本的GetValue()后,名称查找只会找到公开的const版本。虽然ms是非const对象,但const成员函数允许被非const对象调用,因此重载决议选中该函数,且访问权限合法,编译自然通过。
内容的提问来源于stack exchange,提问作者kstn
相关产品推荐
相关产品推荐

