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 条),该程序是 格式错误。