c – 重载模板分辨率
发布时间:2020-12-16 10:07:48 所属栏目:百科 来源:网络整理
导读:// 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;} 根据我的另一个测试,tf
// 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&),它具有与第一个nontemplate相同的参数类型. 那么,为什么第一次调用不明确而第二次调用不是? 解决方法
给定两个同样好的函数模板,重载决策将选择更专业的函数模板,使用通常称为部分排序的过程.确切的规则非常复杂,但实际上它试图确定是否可以调用参数模板A的集合是参数集的(适当的)子集,模板B可以被调用.如果是这样,那么A比B更专业,并且重载决议将更喜欢A.
因此,在你的情况下,tfunc(const T&)可以用?所有东西调用; tfunc(T *)只能用指针调用.后者更专业,因此被选中. 如果您对标准和详细规则感兴趣,请参阅[temp.func.order]和[temp.deduct.partial]. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |