在非常量对象上,为什么 C++ 不使用 public-const 和 private-non-const 重载来调用成员函数的 const 版本?

问题描述 投票:0回答:2
class C
{
public:
    void foo() const {}
private:
    void foo() {}
};

int main()
{
    C c;
    c.foo();
}

MSVC 2013 不喜欢这样:

> error C2248: 'C::foo' : cannot access private member declared in class 'C'

如果我投射到

const
参考,它会起作用:

const_cast<C const &>(c).foo();

为什么我不能在非

const
对象上调用
const
成员函数?

c++ overload-resolution private-methods public-method function-qualifier
2个回答
24
投票

该对象不是

const
,因此非
const
重载是更好的匹配。过载解决发生在访问检查之前。这可以确保重载解析不会因更改成员函数的访问而无意中更改。


22
投票

从标准来看:

13.3.3 如果最佳可行函数存在并且是唯一的,则重载解析成功并生成它作为结果。 否则重载解析失败并且调用格式错误。 当重载解析成功时,并且 最佳可行函数在使用它的上下文中是不可访问的(第 11 条),该程序是 格式错误。

© www.soinside.com 2019 - 2024. All rights reserved.