gno*_*ule 6 c++ overloading class
假设您有一个具有两个成员函数的类T.
char foo() const {...}
char foo() {...}
.我的理解是,当要求一个常数T时,我们决定(1); 对于非常数T,我们决定(2).
笔记:
我试图谷歌为它,但我得到的旧命中是其他重载决议涉及const的情况.然而,链接到一个老SO实际上解释上面显然很棒.
当重新阅读Stroustrup的"The C++编程语言",第2版("特别版"),第11.12节中的String/Cref示例时,就出现了这一点.296.由于Stroustrup是如此精确,答案可能在前几节,但我没有看到在哪里.参考Stroustrup中的部分也非常受欢迎(第2版最好,因为这是我所拥有的).第10.2.6节将const成员引入为"不改变对象值的那些",这暗示了答案,但并没有将我作为明确的解决方案指令.
在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初始化.