【发布时间】:2013-06-04 08:04:39
【问题描述】:
我不明白为什么这个程序会产生下面的输出。
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* 并使用重载?
【问题讨论】:
-
它只是从您提供的选项中选择最接近的匹配项。
class t可以完全匹配char*,不需要转换,所以它会优先选择那个。 -
(顺便说一句,
string示例没有被转换为引用,而是默认通过引用传递,并且只有在没有匹配项时才会成为传递副本。模板不能改变引用性(右值引用的特殊情况除外),因此模板只能通过复制接受类) -
字符串“默认通过引用传递”是什么意思?为什么
t类型不能是std::string&?让我明白的是,这两个电话都不是完全匹配的。string和char*都不是const。 -
正如我所说,“它默认通过引用传递,并且只有在没有匹配项时才会成为传递副本”。换句话说,它尝试
string&然后const string&thenstring和const string。模板only 可以是后两种(因为“模板不能更改引用性”)。第一个不存在,所以第一个好的匹配是第二个。 -
啊,我明白了,谢谢!
标签: c++ templates char constants overloading