为什么当非const成员函数是私有的时候,公共const成员函数不被调用?

123
考虑一下这段代码:
struct A
{
    void foo() const
    {
        std::cout << "const" << std::endl;
    }

    private:

        void foo()
        {
            std::cout << "non - const" << std::endl;
        }
};

int main()
{
    A a;
    a.foo();
}

编译器错误是:
错误:'void A::foo()' 是私有的。
但是当我删除私有的函数时,它就可以工作了。为什么当非const函数是私有的时候,公共的const成员函数没有被调用呢?
换句话说,为什么重载解析在访问控制之前?这很奇怪。你认为这是一致的吗?我的代码本来可以工作,然后我添加了一个成员函数,我的工作代码完全无法编译。

3
在C++中,如果没有采用PIMPL编程技巧等额外的努力,类中就不存在真正的“私有”部分。这只是其中的一个问题(例如增加“私有”方法重载并破坏旧代码的编译在我看来也算是一个问题,即使避免这个问题非常简单,只需要不这样做)。 - hyde
有没有任何真实的代码,你期望能够调用一个const函数,但它的非const对应函数却是私有接口的一部分?这听起来像是糟糕的接口设计。 - Vincent Fourmond
11个回答

8

访问控制符不会影响名称查找和函数调用解析。在编译器检查调用是否应触发访问违规之前,函数已被选择。

这样,如果您更改访问控制符,在现有代码中存在违规时,编译时会发出警报;如果隐私考虑到函数调用解析,您的程序行为可能会悄然更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接