Const重载:C++类中的公共私有查找

ami*_*mit 6 c++

以下代码无法编译,说"错误C2248:'A :: getMe':无法访问类'A'中声明的私有成员".为什么?我试图调用公共接口.

class B
{
};

class A
{
public:
    const B& getMe() const;
private:
    B& getMe(); 
};

int main()
{
A a;
const B& b = a.getMe();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

APr*_*mer 15

其他答案中没有提到的部分问题是可访问性和可见性是C++中的独立概念.的B& A::getMe()私有成员中是可见的main,即使它是不可访问.所以在你的通话中a.getMe()有两个需要考虑的超载成员,B& A::getMe()以及B const& A::getMe() const.由于a不是const它是被选择的私有成员.然后您会收到错误,因为它无法访问.如果你没有私有的非const成员函数,你将有const成员作为唯一的可能性,它将被调用为const成员可以在非const对象上调用.

请注意,如果可见性取决于可访问性,则可能存在其他类型的混淆行为:您重构成员,将调用发送到类外的私有成员.现在,私人会员不再可访问,因此呼叫是公共的不同成员.行为的无声改变可能导致难以追踪的错误.

总而言之:无论你的语言是什么规则,永远不会过载不同的可访问性,它会导致混乱.


sbi*_*sbi 8

在C++中,您不能在返回类型上重载.基于const的重载成员函数也不例外:重载调用函数的对象的constness,而不是返回类型.

做你想要的是一个千载难逢的机会,const_cast用来添加 constness:

const B& b = const_cast<const A&>(a).getMe();
Run Code Online (Sandbox Code Playgroud)

当然,虽然这很奇怪也很有趣,但如果你这样做可能会更容易阅读:

const A& const_a = a;
const B& b = const_a.getMe();
Run Code Online (Sandbox Code Playgroud)