从C ++ Primer,我知道对于模板的参数参数,只执行两种转换:一种是 const转换,另一种是数组/函数转换指针
然而,当涉及到明确的论证时,似乎一切都在变化。 假设我们有一个模板函数:
template <typename T>
int compare(const T &a, const T &b)
{
// do comparison
}
如果没有涉及明确的参数,那么这样的函数调用是非法的:
compare("foo", "foobar");
当我们明确地做的时候发生了奇怪的事情(实际上,它可能并不奇怪,但我不明白):
compare<std::string>("foo", "foobar");
似乎在第二次通话中,“foo”和“foobar”会转换为std::string
,这是有争议的。
模板显式参数是否有特殊规则?感谢。
答案 0 :(得分:6)
在第一种情况下,编译器尝试从给定参数中推导出类型T
。从第一个参数开始,编译器推导出类型const char (&)[4]
(也就是对4个字符数组的引用),从第二个参数得到const char (&)[7]
。这两种类型不匹配,编译器无法确定T
应该是什么。
在第二个示例中,您明确指定T
模板参数应为std::string
。因此T
将为std::string
。编译器接受您提供的类型,并检查给定的函数参数是否与该类型匹配。在这种情况下,参数适合,因为"foo"
和"foobar"
可以隐式转换为std::string
。 (const char[]
降级为const char*
,然后有一个构造函数可以从std::string
构建const char*