在测试中遇到以下任务:

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

10-11 03:54