在测试中遇到以下任务:
#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;时代&#34;
之间的区别是什么?答案 0 :(得分:6)
好问题。它将首先调用模板版本,然后调用非模板版本。 [Live example]
正如解释所说,原因在于这个表达式:
adl(S());
解析器遇到名称adl
后立即解析。请注意,此时尚未声明adl(S)
函数。因此名称必须解析为函数模板。
另一个表达:
adl(t);
是不同的,因为它取决于模板参数T
(t
的类型)。因此,名称的解析被推迟到实例化时间,此时T
的参数已知。实例化发生在main
, 声明adl(S)
之后。因此,此调用解析为非模板版本。