C++模板实例化实现方案与显式实例化解析
1. 模板调用中的二阶段查找问题
在C++编程中,模板调用可能会出现一些复杂的查找问题。例如下面的代码:
// File b.cpp:
#include "common.hpp"
void g(B)
{
}
export template<typename T>
void f(T x)
{
g(x);
}
在文件 a.cpp 中, main() 函数调用 f<X>(X()) ,这会解析到文件 b.cpp 中定义的导出模板。此时, g(x) 的调用会使用类型 X 的参数进行实例化。函数 g() 会进行两次查找:一次是在文件 b.cpp 中使用普通查找(解析模板时),另一次是在文件 a.cpp 中使用ADL(参数依赖查找,实例化模板时)。第一次查找找到 g(B) ,第二次查找找到 g(A) 。由于用户定义的转换,这两个函数都是可行的,因此调用存在歧义。
需要注意的是,在文件 b.cpp 中, g(x) 的调用看起来并没有歧义。正是二阶段查找机制引入了可能意想不到的候选函数。所以在编写和记录导出模板时,需要格外小心。
超级会员免费看
订阅专栏 解锁全文
2147

被折叠的 条评论
为什么被折叠?



