在非const对象上,为什么C ++不会使用public-const和private-non const重载来调用方法的const版本?

时间:2014-08-14 20:11:30

标签: c++ const private public

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方法?

2 个答案:

答案 0 :(得分:24)

对象不是const,因此非const重载是更好的匹配。在访问检查之前发生过载解析。这样可以确保通过更改成员函数的访问权限来无意中更改重载决策。

答案 1 :(得分:22)

来自标准:

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