c++ - 重载模板解析

标签 c++ templates overloading

// 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/

相关文章:

java - 重载java

c++ - 具有指定基类的类声明

c++ - 连接超过1个节点的子列表时,链表合并合并的C++实现失败

c++ - Qt QAbstractItemModel - 项目删除崩溃

c++ - 我的模板类定义中有一些循环

c++ - 函数模板参数和采用 'auto' 的函数参数有什么区别?

java - 自动装箱和重载

java - Java中用 'instanceof'重构部分代码重载方法解决方案

c++ - c或c++中的静态 block 是什么?

c++ - 您创建 GUI 的最佳库(gtk、qt、win32 api 等)?