以下代码可以在gcc和clang下编译通过。
template <typename T>
struct identity
{
typedef T type;
};
template <typename T>
void foo(typename identity<T>::type);
template <typename T>
void foo(T);
int main()
{
foo<int>(0);
}
看起来过载分辨率正在选择第一个重载(identity<T>::type
)。
有人能解释一下为什么这些重载不是模棱两可的吗?据我所知,它们之间唯一的区别就是第一个参数是非推导上下文,而第二个参数则不是,但既然我明确提供了模板参数,我不明白为什么这会有影响。
foo<int>(0)
而是使用foo(0)
启用类型推断,则会选择第二个函数(身份元函数没有类型推断)。@Andy Prowl:我不想质疑您的答案,但要指出您的推理并不像看起来那么明显。给foo参数一个默认值,并调用foo<int>()
而不带参数。您的论证仍然适用,但现在重载确实是模棱两可的,就像HighCommander4所预期的那样。函数模板的显式模板实例化很复杂。 - Patrick Fromberg