You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不同作用域下函数重载的可见性问题:编译器是否存在Bug?

这不是编译器Bug,是C++重载解析规则的正常表现

这不是编译器的Bug,完全符合C++的重载解析规则,具体原因拆解如下:

  1. 名称查找阶段:
    当在Sample2::Compute()中调用ms.GetValue()时,编译器会在Sample类的作用域内查找所有名为GetValue的函数,最终找到两个候选:

    • 公开的const double& GetValue() const
    • 受保护的double& GetValue()
  2. 重载决议阶段:
    由于ms是非const的Sample实例,非const成员函数double& GetValue()的匹配优先级更高——它不需要将对象视为const类型,因此会被编译器选为最优匹配。

  3. 访问权限检查阶段:
    选中的double& GetValue()是protected修饰的成员,而Sample2既不是Sample的派生类,也不是它的友元,不符合protected成员的访问规则,因此触发编译错误。

当你删除protected版本的GetValue()后,名称查找只会找到公开的const版本。虽然ms是非const对象,但const成员函数允许被非const对象调用,因此重载决议选中该函数,且访问权限合法,编译自然通过。

内容的提问来源于stack exchange,提问作者kstn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:47:08