在测试中遇到以下任务:
#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()); }
问题是将调用哪些函数。
还有一种解释是,不依赖于模板参数的函数名称在模板定义时解析,而依赖模板参数的函数名称在模板参数已知时解析。那么,这些“时间”之间有什么区别?
最佳答案
好问题。它将首先调用模板版本,然后调用非模板版本。 [Live example]
原因是,正如解释所说,在这个表达式中:
adl(S());
名称
adl
一旦解析器遇到它就会被解析。请注意,此时尚未声明 adl(S)
函数。因此名称必须解析为函数模板。另一种表达:
adl(t);
不同,因为它取决于模板参数
T
(这是 t
的类型)。因此,名称的解析被推迟到实例化时间,当 T
的参数已知时。在 main
声明之后,实例化发生在 adl(S)
中。因此,此调用解析为非模板版本。关于c++ - 取决于模板参数的函数名称解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28483071/