在非常量对象上,为什么C++不调用具有 public-const 和私有-nonconst 重载的方法的 const 版本?

On a nonconst object, why won't C++ call the const version of a method with public-const and private-nonconst overloads?

本文关键字:public-const -nonconst 重载 const 方法 版本 对象 常量 非常 为什么 调用      更新时间:2023-10-16
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条),程序是不规范的。