C ++ const char *重载混乱

时间:2013-06-07 22:27:33

标签: c++ templates char const overloading

我不明白为什么这个程序产生下面的输出。

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 *并使用重载?

1 个答案:

答案 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]