// 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 &)
,它与第一个非模板具有相同的参数类型.
那么,为什么第一个调用不明确而第二个不明确?
最佳答案
给定两个在其他方面都一样好的函数模板,重载解析将选择更专业的函数模板,使用通常称为部分排序的过程。确切的规则非常复杂,但本质上它试图确定参数集模板 A 是否可以调用是参数集模板 B 的(适当的)子集。如果是这样,那么 A 比 B 更特化,重载解析会优先选择 A。
因此,在您的情况下,可以使用 ~everything 调用 tfunc(const T&)
; tfunc(T*)
只能用指针调用。后者更专业,因此被选中。
如果您对标准和详细规则感兴趣,请参阅 [temp.func.order]和 [temp.deduct.partial] .
关于c++ - 重载模板解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46019548/