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)
问题是将调用哪些函数.还有一种解释是,在模板定义时解析不依赖于模板参数的函数的名称,而在知道模板参数时解析依赖于模板参数的函数的名称.嗯,这些"时代"之间有什么区别?
好问题.它将首先调用模板版本,然后调用非模板版本.[实例]
原因是,正如解释所说,在这个表达式中:
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).因此,此调用解析为非模板版本.
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |