函数名称解析取决于模板参数

Function name resolution depending on template parameter

本文关键字:参数 取决于 函数      更新时间:2023-10-16

在测试中遇到以下任务:

#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()); }

问题是将调用哪些函数。还有一种解释是,不依赖于模板参数的函数的名称在模板定义时解析,而依赖于模板变量的函数的名字在已知模板变量时解析。那么,这些"时代"之间有什么区别?

好问题。它将首先调用模板版本,然后调用非模板版本。【实例】

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

adl(S());

解析程序一遇到名称adl就解析它。请注意,此时adl(S)函数尚未声明。因此,名称必须解析为函数模板。

另一个表达式:

adl(t);

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