1

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

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

4

1 回答 1

3

的类型"hi"const char[3],而 的类型achar[4]

因此,第一次调用只需要数组到指针的转换(又名“衰减”)。第三个调用只需要将一个对象绑定到一个引用到常量(我不认为“转换”是引用绑定的正确术语,尽管我可能弄错了)。第二次调用需要数组衰减指针转换才能调用const char*重载。

我声称没有实际检查标准中的重载解决文本,这个额外的步骤使模板比重const char*载更匹配。

顺便说一句,如果您更改"unknown\n""%s\n", typeid(t).name()then 您可以看到t推断出的类型。对于您的代码,它被推断为char*(因为数组不能按值传递),但是看看如果您将模板更改为采用t&参数而不是t. 那么t可以推导出为char[4]

于 2013-06-07T22:49:31.627 回答