2

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

模板显式参数有什么特殊规则吗?谢谢。

4

1 回答 1

6

在第一种情况下,编译器试图T从给定的参数中推断出类型。编译器从第一个参数推导出类型const char (&)[4](又名。引用 4 个字符的数组),从第二个参数得到const char (&)[7]. 这两种类型不匹配,编译器无法弄清楚T应该是什么。

在第二个示例中,您明确指定T模板参数应该是 std::string. T 也会如此std::string。_ 编译器接受您提供的类型并检查给定的函数参数是否与该类型匹配。在这种情况下,参数适合,因为"foo""foobar"可以隐式转换为std::string。(const char[]降级为,然后有一个可以从 aconst char*构造 a 的构造函数)std::stringconst char*

于 2012-09-25T00:30:09.247 回答