我不明白为什么这个程序产生下面的输出。
void blah(const char* ) {printf("const char*\n");}
void blah(const std::string&) {printf("const string ref\n");}
template<class t>
void blah(t) {printf ("unknown\n");}
int main(int, char*)
{
blah("hi");
char a[4];
blah(a);
std::string s;
blah(s);
getch();
}
输出:
const char*
unknown
const string
在VS2008中。它愿意将std :: string转换为const引用,但为什么不将char *转换为const char *并使用重载?
答案 0 :(得分:3)
"hi"
的类型为const char[3]
,而a
的类型为char[4]
。
因此,第一次调用只需要数组到指针的转换(又名“衰减”)。第三个调用只需要将一个对象绑定到一个引用到const(我不认为“转换”是引用绑定的正确术语,尽管我可能会弄错)。第二个调用需要数组衰减和指针转换才能调用const char*
重载。
我声称没有实际检查标准中的重载决议文本,这个额外的步骤使模板比const char*
重载更好地匹配。
顺便说一句,如果您将"unknown\n"
更改为"%s\n", typeid(t).name()
,那么您可以看到推断出t
类型的内容。对于您的代码,它被推导为char*
(因为数组不能按值传递),但是如果您更改模板以采用t&
参数而不是t
,请查看会发生什么。然后t
可以推断为char[4]
。