// g++(5.4)
void func(int * const &) {}
void func(int *) {}
template <typename T> void tfunc(const T &) {}
template <typename T> void tfunc(T *) {}
int main()
{
int a = 0;
func(&a); // ambiguous
tfunc(&a); // unambiguous
return 0;
}
根据我的另一个测试,tfunc(&a)
实例第一模板void tfunc(int * const &)
具有相同的参数类型作为第一个非模板。超载模板分辨率
那么,为什么第一个电话含糊不清,但第二个电话不是?
对于第一呼叫的发挥机制是参数通常值转换为普通函数重载解析。两种(非)转换显然同样好。对于第二次调用,正在进行的机制是函数模板参数推导。这里赢了,因为它是*完全匹配*。对不起,我不能给你一个完整的答案,直到详细程度,但这是寻找答案的方向:游戏中的机制是非常不同的,具有不同的规则集。 –