【发布时间】:2019-12-19 01:52:13
【问题描述】:
template<typename T>
int fun(T){
return 0;
}
int main(){
fun(0); //#1
fun(1); //#2
}
首先,在#1的调用点,编译器需要为类型“int”(隐式实例化)实例化模板函数,然后将实例化结果用于“fun(0)”,这个过程是没有的问题,但是在调用#2时,编译器是直接使用#2的上述实例化的结果还是进行任何其他过程(例如编译器将为#2实例化但找到上面类型“int”的实例化然后停止实例化并使用上面的结果)?换句话说,当 #2 被调用时,#1 的实例化是否参与重载决议?
更新:
我的另一个问题是,当遇到相同的调用(这里是#2)时,已经实例化(#1的隐式实例化)是否参与重载决议?
【问题讨论】:
-
查看overload resolution 过程,实例化不起作用,因为它仅依赖于函数声明。一种或另一种方式会产生什么后果?
-
@kmdreko 后果就是编译器是否需要再推演和代换,如果在有stateful meta的代换上下文中,后续结果会大不相同
-
编译器将在两次调用中插入对方法 fun
的调用,并让链接器稍后解决。在第一次调用时,编译器应该为 int 专门化函数(或者作为最后一步,这里的顺序并不重要,只是编译器的细节)。