#include <iostream>
using namespace std;

template<typename T>
void adl(T)
{
  cout << "T";
}

struct S
{
};

template<typename T>
void call_adl(T t)
{
  adl(S());
  adl(t);
}

void adl(S)
{
  cout << "S";
}

int main ()
{
  call_adl(S());
}

为什么结果是“TS”?模板函数中的名称查找规则是什么?

http://ideone.com/sB3DnL

最佳答案

模板在定义和实例化两个阶段进行编译。第一阶段发生在编译器首次处理模板定义时,并且一些名称立即绑定(bind)到定义。某些名称在实例化模板之前是未绑定(bind)的,因为它们取决于模板参数,因此只有在实例化模板并且知道模板参数后才能查找它们。

在此通话中:

adl(S());

没有任何东西依赖于该函数的模板参数,因此查找(在第一阶段期间)立即完成,并且它会找到当时在范围内的唯一函数adl

在此通话中:
adl(t);

它取决于t的类型,因此查找会延迟到知道t的类型实例化为止。当您调用call_adl(S())时,在范围内是adl的第二个重载,因此当adl(t)调用执行名称查找时,范围内还有另一个函数,它与参数更匹配。

关于c++ - 模板功能中的名称查找规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42729586/

10-10 21:24