模板中显式参数的转换

Ke *_* Li 2 c++ templates

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

模板显式参数是否有任何特殊规则?谢谢.

sth*_*sth 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来自a const char*)