加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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].

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读