模板中显式参数的转换

时间:2012-09-25 00:00:22

标签: c++ templates

从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,这是有争议的。

模板显式参数是否有特殊规则?感谢。

1 个答案:

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