c++ - 当非常量方法是私有(private)的时,为什么不调用公共(public) const 方法?

标签 c++ overloading overload-resolution private-methods const-method

考虑这段代码:

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();
}

编译错误是:

error: 'void A::foo()' is private`.

但是当我删除私有(private)的时,它就可以工作了。为什么非 const 方法是 private 时不调用 public const 方法?

换句话说,为什么重载解决在访问控制之前?这很奇怪。你认为它是一致的吗?我的代码可以工作,然后我添加了一个方法,我的工作代码根本无法编译。

最佳答案

当您调用 a.foo(); 时,编译器会通过重载解析来找到要使用的最佳函数。当它构建它发现的重载集时

void foo() const

void foo()

现在,由于 a 不是 const,因此非常量版本是最佳匹配,因此编译器选择 void foo() .然后访问限制就位,你会得到一个编译器错误,因为 void foo() 是私有(private)的。

请记住,在重载决议中,它不是“找到最佳可用函数”。它是“找到最好的功能并尝试使用它”。如果由于访问限制或被删除而无法访问,则会出现编译器错误。

In other words why does overload resolution comes before access control?

好吧,让我们看看:

struct Base
{
    void foo() { std::cout << "Base\n"; }
};

struct Derived : Base
{
    void foo() { std::cout << "Derived\n"; }
};

struct Foo
{
    void foo(Base * b) { b->foo(); }
private:
    void foo(Derived * d) { d->foo(); }
};

int main()
{
    Derived d;
    Foo f;
    f.foo(&d);
}

现在让我们说我并不是真的打算将 void foo(Derived * d) 设为私有(private)。如果首先出现访问控制,则该程序将编译并运行,并且 Base 将被打印。这在大型代码库中可能很难追踪。由于访问控制是在重载解决之后出现的,所以我收到一个很好的编译器错误,告诉我无法调用我想要它调用的函数,我可以更容易地找到错误。

关于c++ - 当非常量方法是私有(private)的时,为什么不调用公共(public) const 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39042240/

相关文章:

c++ - 静态转换以避免 IDE 警告?

c++ - 如何实现类似于 std::vector 的自定义类

c++ - 万不得已/包罗万象/后备模板过载

c++ - 调用 const 函数而不是其非 const 版本

c++ - 确定选择了哪个重载

c++ - 从 sockaddr * 转换为 sockaddr_in * 增加了所需的对齐方式

c++ - 在声明为 'const_iterator' 的函数中迭代具有 'const' 的集合会导致错误

c++ - 在选定的 QMenu 项目上显示刻度图像

C++根据条件为堆栈对象选择重载的构造函数

c++ - 滥用逗号运算符