繁体   English   中英

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

[英]Overload resolution C++ for const member functions

假设您有一个具有两个成员函数的类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成员引入为“不改变对象值的那些”,这暗示了答案,但并没有将我作为明确的解决方案指令。

在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初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM