假设我有一个函数模板,其中type参数仅用作返回类型:
template <typename T>
T foo()
{
return whatever;
}
那么专门化该函数模板的正确语法是什么?以下两个似乎都有效:
template <>
std::string foo()
{
return whatever;
}
template <>
std::string foo<std::string>()
{
return whatever;
}
这两者有什么区别吗?如果没有,那么惯用的方式是什么?
编译器将根据提供的信息(此处为函数返回类型)推导出正确的模板特化。
因此,这些语法具有完全相同的行为,一个比另一个更明确。
在大多数情况下,两者之间没有区别。
如果你重载了几个模板函数,可能需要第二种形式来消除你想要专门化的重载的歧义(如果你处于这种情况下,你可能还有其他问题,例如你也需要在调用地方明确)。