下面的代码用 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
)。
有人可以解释为什么重载不是模棱两可的吗?据我所知,它们之间的唯一区别是第一个参数是非推导上下文,而第二个参数不是,但是由于我明确提供了模板参数,所以我不不明白为什么这很重要。