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