在nonconst对象上,为什么C++不会使用public-const和private-nonconst重载调用方法的const版本?

jap*_*iss 26 c++ const private public

class C
{
public:
    void foo() const {}
private:
    void foo() {}
};

int main()
{
    C c;
    c.foo();
}
Run Code Online (Sandbox Code Playgroud)

MSVC 2013不喜欢这样:

> error C2248: 'C::foo' : cannot access private member declared in class 'C'
Run Code Online (Sandbox Code Playgroud)

如果我转向const参考,它的工作原理:

const_cast<C const &>(c).foo();
Run Code Online (Sandbox Code Playgroud)

为什么我不能const在非const对象上调用该方法?

jua*_*nza 24

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

  • 理由是设计人员认为查找和解决方案取决于访问检查是否容易出错; 将方法从公共更改为私有可能导致该函数的使用无声地切换到其他功能而不是意图. (18认同)

imr*_*eal 22

从标准:

13.3.3如果存在一个最好的可行函数并且是唯一的,则重载决策成功并将其作为结果产生.否则重载解析失败并且调用格式错误.当重载决策成功,并且在使用它的上下文中无法访问最佳可行功能(第11条)时,程序是不正确的.

  • 即,C++中的查找语义适用,就像访问检查不存在一样.然后应用访问检查.访问检查不会影响可见性和选择,只会影响权限. (12认同)
  • @usr改变行为也是一个突破性的变化.最好早点失败.但在实际代码中,您不应该具有不同访问权限的重载. (2认同)