转换为模板
从C++入门明确的说法,我知道,模板的参数变量,只有两种转换进行:一个是常量转换,另一个是阵列/函数指针转换。转换为模板
但是,当谈到明确的论点时,似乎一切都在改变。 假设我们有一个模板函数:
template <typename T>
int compare(const T &a, const T &b)
{
// do comparison
}
如果没有明确的说法参与,这样的函数调用是非法的:
compare("foo", "foobar");
怪异的事情发生了(实际上,它可能不是很奇怪,但我做的不明白),当我们明确地做:
compare<std::string>("foo", "foobar");
看来,在第二个电话,“富”和“foobar”转换为std::string
,这是有争议的。
模板显式参数是否有特殊规则?谢谢。
在第一种情况下,编译器试图从给定的参数中推导出类型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*
)
+1:需要强调的是,对于模板参数推导,类型必须完美匹配(即不允许转换)。另外,如果参数的类型是'T'而不是'T const&',那么这些数组将衰变为指针,这也是可行的。 –
为什么这看起来有争议吗?通过提供显式的模板参数,您表明您希望将相应的'T'参数转换为'const std :: string&',它通过使用字符串文字的'std :: string'构造函数重载来完成。你期待什么行为?如果'T'没有转换构造函数(或者具有'explicit'),那么这不会发生。 –
这是否意味着当我们用std :: string显式绑定T时,会生成实际的函数代码? –