考虑这段代码:
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/