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

Vla*_*nin 4 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()); }
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*ica 6

好问题.它将首先调用模板版本,然后调用非模板版本.[实例]

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

adl(S());
Run Code Online (Sandbox Code Playgroud)

adl一旦解析器遇到它,名称就会被解析.请注意,此时adl(S)尚未声明该函数.因此名称必须解析为功能模板.

另一个表达方式:

adl(t);
Run Code Online (Sandbox Code Playgroud)

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