在非常量对象上,为什么C++不调用具有 public-const 和私有-nonconst 重载的方法的 const 版本?


class C
{
public:
    void foo() const {}
private:
    void foo() {}
};
int main()
{
    C c;
    c.foo();
}

MSVC 2013不像这样:

> error C2248: 'C::foo' : cannot access private member declared in class 'C'

如果我转换到一个const引用,它工作:

const_cast<C const &>(c).foo();

为什么我不能在非const对象上调用const方法?

对象不是const,所以非const过载是更好的匹配。在访问检查之前进行过载解析。这确保重载解析不会因更改成员函数的访问而意外改变。

从标准:

13.3.3如果存在最佳可行函数并且是唯一的,则重载解析成功并产生该函数作为结果。否则,重载解析将失败,调用将是错误的。当重载解析成功时,和最佳可行函数在使用它的上下文中是不可访问的(第11条),程序是不规范的。

相关内容

  • 没有找到相关文章

最新更新