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
方法?
答案 0 :(得分:24)
对象不是const
,因此非const
重载是更好的匹配。在访问检查之前发生过载解析。这样可以确保通过更改成员函数的访问权限来无意中更改重载决策。
答案 1 :(得分:22)
来自标准:
13.3.3如果存在一个最好的可行函数并且是唯一的,则重载决策成功并将其作为结果产生。 否则重载解析失败并且调用格式错误。 当重载解析成功时,和 在使用它的上下文中,最好的可行功能是不可访问的(第11条),程序是 不良形成。强>