功能名称解析取决于模板参数

时间:2015-02-12 16:46:44

标签: c++ templates argument-dependent-lookup

在测试中遇到以下任务:

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

之间的区别是什么?

1 个答案:

答案 0 :(得分:6)

好问题。它将首先调用模板版本,然后调用非模板版本。 [Live example]

正如解释所说,原因在于这个表达式:

adl(S());

解析器遇到名称adl后立即解析。请注意,此时尚未声明adl(S)函数。因此名称必须解析为函数模板。

另一个表达:

adl(t);

是不同的,因为它取决于模板参数Tt的类型)。因此,名称的解析被推迟到实例化时间,此时T的参数已知。实例化发生在main 声明adl(S)之后。因此,此调用解析为非模板版本。