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条),程序是不规范的。