const成员函数的重载决策C ++

时间:2014-01-30 22:52:54

标签: c++ class overloading

假设您有一个具有两个成员函数的类T

  1. char foo() const {...}
  2. char foo() {...}
  3. 据我所知,当需要一个常数T时,我们决定(1);对于非常数T,我们决定(2)。

    1. 是正确的吗?
    2. 在此决议中调用哪条规则? (参考标准的伟大,但有用的简要总结赞赏)
    3. 注意:

      1. 我试图谷歌为它,但我得到的旧点击是其他涉及const的重载决议的情况。然而,链接到一个老SO实际上解释上面显然很棒。

      2. 重新阅读Stroustrup的“The C ++编程语言”,第2版(“特别版”),第11.12节中的String / Cref示例,p。 296.由于Stroustrup是如此精确,答案可能在前几节,但我没有看到在哪里。参考Stroustrup中的部分也非常受欢迎(第2版最好,因为这是我所拥有的)。第10.2.6节将const成员引入“不改变对象值”的那些成员,这暗示了答案,但并没有将我作为明确的解决方案指示。

1 个答案:

答案 0 :(得分:5)

在N3242(我手头的标准草案)中,13.3.1第4段说

  

对于没有声明的[非静态成员]函数,隐式对象参数的类型是“对 cv X的左值引用”   参考资格赛或与& REF-限定符

这意味着首先出现的隐式对象参数的类型是“cv X的左值引用”,其中X是类,cv是cv-成员变量的限定(即const或非const)。然后,重载决议继续正常进行。

要查看重载解析过程,首先,两者都列为“候选”函数,因为它们位于正确的范围内并具有正确的名称。

const情况下,只有const成员函数进入下一步(称为“可行性”),因此它自动成为最佳选择。非const成员函数不可行,因为您无法将const引用转换为非const引用。

在非常量情况下,const和非const版本都是可行的,但非常量版本是“更好的”,因为下面引用了13.3.3.2第3段的第五条规则。

  

标准转换序列S1是比转换序列更好的转换序列   标准转换序列S2 if ......

     

S1和S2是引用绑定,以及与之类型相关的类型   引用引用是相同的类型,除了顶级cv限定符,   并且S2引用的引用所引用的类型更多   cv-qualified比S1初始化的引用类型   指。