从C++ Primer,我知道对于模板的参数参数,只执行两种转换:一种是const转换,另一种是指针转换的数组/函数.
然而,当涉及到明确的论证时,似乎一切都在变化.假设我们有一个模板功能:
template <typename T>
int compare(const T &a, const T &b)
{
// do comparison
}
Run Code Online (Sandbox Code Playgroud)
如果没有涉及明确的参数,那么这样的函数调用是非法的:
compare("foo", "foobar");
Run Code Online (Sandbox Code Playgroud)
当我们明确地做到时,奇怪的事情发生了(实际上,它可能并不奇怪,但我不明白):
compare<std::string>("foo", "foobar");
Run Code Online (Sandbox Code Playgroud)
似乎在第二次调用中,"foo"和"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
来自a const char*
)