c – 非const指针优先于const T和重载const T *
发布时间:2020-12-16 03:21:41 所属栏目:百科 来源:网络整理
导读:假设我有两个函数重载 template typename Tvoid f(const T) { cout "f(T)" endl;}template typename Tvoid f(const T*) { cout "f(T*)" endl;} 为什么f(new int)解析为f(const T)而不是f(const T *)?在标准的任何地方谈论这种反直觉的行为? http://ideone.
假设我有两个函数重载
template <typename T> void f(const T&) { cout << "f(T&)" << endl; } template <typename T> void f(const T*) { cout << "f(T*)" << endl; } 为什么f(new int)解析为f(const T&)而不是f(const T *)?在标准的任何地方谈论这种反直觉的行为? http://ideone.com/kl8NxL 解决方法
对于使用模板扣除的重载分辨率,第一步是解析模板.然后将非模板排序应用于结果.在您的代码中,模板分辨率为:
void f(int * const &) // 1 void f(int const *) // 2 根据C14 [over.ics.ref],如(1)中直接引用参数的引用是一个身份转换(即使添加了cv-qualifiers). T与T const&是直接约束,即没有创建和绑定临时的. 但是,(2)涉及资格转换.在匹配函数参数之前,参数类型int *必须转换为const int *. 身份转换被认为是任何非身份转换序列的子序列,所以(1)根据子序列规则[over.ics.rank] /3.1.1获胜 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |