2014-01-30 32 views
4

假设有一类T,带两个成员函数重载分辨率C++对const成员函数

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

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

  1. 是正确的吗?
  2. 在此决议中调用哪条规则? (参考标准伟大的,但一个有用的简要理解)

注:

  1. 我试图谷歌,但旧的命中我得到了SO份,涉及常量其他重载决议情况。然而,链接到一个老的SO实际上解释上述显然很大。

  2. 当重新阅读Stroustrup的“C++编程语言”,第2版(“特别版”),第11.12节中的字符串/ 294.由于Stroustrup如此精确,答案可能在前几节中,但我无法看到在哪里。参考Stroustrup中的章节也非常受欢迎(第2版最好,因为这是我拥有的版本)。第10.2.6节将const成员引入为“不改变对象值”的那些成员,这暗示了答案,但并不意味着我是一个明确的解析指令。

+2

在高级视图中,您可以考虑编译器将执行的转换。成员函数将被转换为:'char foo(T const * this)'和'char foo(T * this)'(细节除外)。 –

+0

@David Rodriguez - dribeas:我明白了;对于指针类型的参数,const p和p在重载分辨率上是有区别的,是正确的吗?这确实给了一些直觉。 – gnometorule

+0

我已正确地重新格式化您的问题。请花点时间阅读[Markdown格式帮助](http://stackoverflow.com/help/formatting)。 –

回答

4

在N3242(标准草案我手边),13.3.1第4段表示

隐含对象参数的类型是“左值参照CV X”为[未经 REF-限定符或与& REF-限定符

这意味着类型的隐含对象参数,其发生的第一声明非静态成员]功能,是一个“左值参考cv X”,其中X是该类,并且cv是成员变量的cv限定(即, const或非const)。然后,重载分辨率照常继续。

要检查重载解析过程,首先,它们都列为“候选”函数,因为它们在正确的范围内并且名称正确。

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

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

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

S1和S2是参考绑定,和类型其中 引用参考是除了同一类型对于顶级cv限定符 以及由S2初始化的参考引用的类型更多 cv-qualified比S1 所引用的引用初始化的类型更多。

+0

你的解释是有道理的,但(a)不应该继续报价?它似乎是“如果类型是(...)”,但似乎错过了“然后(...)”; (b)报价适用于t *会员*职能,是否正确? (引号只表示功能 – gnometorule

+0

对不起,因为它在上面的句子中被提到而丢失了,现在有意义吗? – rmcclellan

+0

我看到你已经处理了(b)(谢谢);关于(a)?(或者告诉我如果/为什么(a)无关紧要) – gnometorule