【发布时间】:2014-02-23 12:03:16
【问题描述】:
假设你有一个有两个成员函数的类 T
char foo() const {...}-
char foo() {...}.
我的理解是,当需要一个常数 T 时,我们会解析为 (1);对于非常量 T,我们解决 (2)。
- 对吗?
- 在此解析中调用了哪个规则? (参考标准很棒,但感谢提供有用的简短摘要)
注意事项:
我试图用谷歌搜索它,但我在 SO 上获得的旧命中是其他涉及 const 的重载解决方案的案例。但是,链接到一个旧的 SO 实际上解释了上述内容显然很棒。
在重新阅读 Stroustrup 的“C++ 编程语言”,第 2 版(“特别版”),第 11.12 节中的字符串/Cref 示例时出现了这个问题,p。 296. 由于 Stroustrup 如此精确,答案可能在前面的部分中,但我看不出在哪里。也非常欢迎参考 Stroustrup 中的部分(第二版最好,因为这是我拥有的)。第 10.2.6 节将 const 成员介绍为那些“不改变对象的值”的成员,这暗示了答案,但并没有让我觉得它是一个明确的解决指令。
【问题讨论】:
-
在高级视图中,您可以考虑编译器将执行的转换。成员函数将被转换为:
char foo(T const *this)和char foo(T *this)(详情暂且不谈)。 -
@David Rodriguez - dribeas:我明白了;而对于指针类型参数, const p 和 p 在重载决议中是有区别的,对吗?这确实给出了一些直觉。
-
我已经正确地重新格式化了您的问题。请花点时间阅读Markdown formatting help。
-
@Konrad Rudolph:感谢。问题是当我在远离计算机时使用 iPhone 时:我熟悉正确的格式,但已知手机会添加/删除不可打印的内容。它在我的手机上看起来正确,但不是。我通常在家编辑一次,但不想等到半夜才提问。
-
附加的
T*/T const*参数称为隐式对象参数(虽然它实际上是一个引用);我不明白为什么这应该是一个高级视图。隐式对象参数和实际函数参数之间存在一些细节差异,但 AFAIK 重载决议的大部分都平等地对待它们。见[over.match.funcs]
标签: c++ class overloading