27
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对象上调用该方法?

4

2 回答 2

24

对象不是const,因此非const重载是更好的匹配。重载解决发生在访问检查之前。这确保重载决议不会因更改成员函数的访问而无意更改。

于 2014-08-14T20:13:01.387 回答
22

从标准:

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

于 2014-08-14T20:15:05.610 回答