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

gno*_*ule 6 c++ overloading class

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

  1. char foo() const {...}
  2. char foo() {...}.

我的理解是,当要求一个常数T时,我们决定(1); 对于非常数T,我们决定(2). 

  1. 那是对的吗?   
  2. 在这个决议中调用哪个规则?(参考标准很棒,但有用的简要总结表示赞赏) 

笔记:

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

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

rmc*_*lan 8

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

对于没有引用限定符或使用&ref-qualifier声明的[非静态成员]函数,隐式对象参数的类型是"对cv X的左值引用"

这意味着首先出现的隐式对象参数的类型是"左值引用cv X",其中X是类,并且cv是成员变量的cv限定(即const或非const).然后,重载分辨率继续正常.

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

在这种const情况下,只有const成员函数进入下一步(称为"生存能力"),因此它自动成为最佳选择.非const成员函数不可行,因为您无法将const引用转换为非const引用.

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

标准转换序列S1是比标准转换序列S2更好的转换序列,如果......

S1和S2是引用绑定,引用引用的类型除了顶级cv限定符之外是相同的类型,并且S2引用的引用所引用的类型比cv限定的类型更具cv限定类型.参考由S1初始化.