C++ 如果存在非常量限定的私有方法,为什么不能对非常量对象调用常量限定的方法?

C++ 如果存在非常量限定的私有方法,为什么不能对非常量对象调用常量限定的方法?,c++,overloading,overload-resolution,private-methods,const-method,C++,Overloading,Overload Resolution,Private Methods,Const Method,以下代码未编译: struct A { void f () const { } private: void f () { } }; int main () { A a_nc; const A a_c; a_nc.f(); a_c.f(); return 0; } 错误: test.cpp: In function 'int main()': test.cpp:4:10: error: 'void A::f()' is private

以下代码未编译:

struct A {
    void f () const { }
private:
    void f () { }
};

int main () {
    A a_nc;
    const A a_c;
    a_nc.f();
    a_c.f();
    return 0;
}
错误:

test.cpp: In function 'int main()':
test.cpp:4:10: error: 'void A::f()' is private
     void f () { }
          ^
test.cpp:10:12: error: within this context
     a_nc.f();
            ^
我正在Windows上使用
g++(tdm64-1)5.1.0

我不明白为什么当非常量限定方法不可用时,编译器不能返回常量限定方法
f

我想不出允许编译器使用const限定方法而不是non-const限定方法会使程序行为异常的上下文,是不是?如果没有,为什么不允许这样做

编辑:

我已经看到了这个问题:


但是在上面,这两种方法都是可用的,所以我很清楚选择。在我的例子中,一个方法不可用,但编译器无法选择另一个,相反,它无法编译

因为它首先通过重载解析选择方法。一旦确定了要调用的一个方法,就会检查您是否具有正确的访问权限。换句话说,访问说明符不会影响重载解析。

我没有答案,但您可以使用类方法指针强制回答。重新编辑:这就是我反复问另一个问题的原因。@t.C.您的副本清楚地回答了我的问题,谢谢。有没有办法不在这个问题的顶部显示另一个?@holt读取链接中的“c++注释”位,它作为的副本关闭。它说明了C++中对这个行为的确切要求。@ xAxon“C++注释”位说明编译器选择了最接近的匹配,但我所要寻找的是为什么访问没有被考虑到“最接近的匹配”定义中。T.C.邮报中引用的参考文献清楚地回答了这一部分。