【发布时间】:2015-01-15 21:01:38
【问题描述】:
我有以下测试代码:
#include <string>
#include <iostream>
class CString
{
public:
CString(char const*) {}
};
class TestBed
{
public:
void Comparison(CString const&) { std::cout << "CString Overload" << std::endl; }
void Comparison(std::string const&) { std::cout << "std::string overload" << std::endl; }
};
int main()
{
TestBed tb;
tb.Comparison("Hello World");
}
此代码无法编译,因为对 Comparison() 的调用不明确。我期待这种行为。
但是,当我使 Comparison() 重载 const 中的任何一个时,例如:void Comparison(std::string const&) const 或 void Comparison(CString const&) const(但不是两者),代码将编译并选择非常量重载。
重载解决规则非常复杂,我还没有看到任何描述const 如何影响这种情况的内容。我的理解是:
- 首先选择具有完全匹配参数的函数
- 接下来尝试一级隐式转换
在这两种情况下,1 和 2 都是模棱两可的。有人可以解释一下吗?谢谢。
【问题讨论】:
-
this指针也是一个(隐藏的)参数,进入解析。具有最少隐式转换的原型获胜,其中非 const 到 const 是一种转换。 -
@Creris 函数的 const 版本需要 2 次转换(1 次用于字符串,1 次用于
this),非 const 只需 1 次。 -
@MarkRansom 不抱歉,我以为他添加了新的重载,实际上他编辑了其中一个,所以转换为 1, 1 -> 2, 1 转换。
-
const 版本意味着两种转换:字符串文字 -> 字符串对象和
TestBed&->const TestBed&(对于*this)。非常量版本只有第一个转换(字符串),没有第二个。
标签: c++ c++11 overloading