模板函数中的名称查找规则

时间:2017-03-10 23:47:51

标签: c++ c++11 templates

#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());
}

为什么结果是&#34; TS&#34;?模板函数中的名称查找规则是什么?

http://ideone.com/sB3DnL

1 个答案:

答案 0 :(得分:9)

模板分为两个阶段,即定义点和实例化点。第一个阶段发生在编译器首次处理模板定义时,一些名称立即绑定到定义。在实例化模板之前,某些名称保持未绑定状态,因为它们依赖于模板参数,因此在实例化模板并且模板参数已知之前无法查找。

在此电话会议中:

adl(S());

在函数的模板参数上没有任何依赖,所以立即完成查找(在第一阶段),它找到唯一一个名为adl的函数在这一点上是在范围内。

在此电话会议中:

adl(t);

它是依赖t类型,因此查找会延迟到实例化时t的类型已知。当您调用call_adl(S()) adl的第二个重载在范围内时,因此当adl(t)调用执行名称查找时,范围内还有另一个函数,并且它更适合争论。