面试题答案
一键面试- 模板函数重载规则:
- 精确匹配优先:更具体的模板特化或非模板函数优先于一般的模板函数。例如,如果存在一个针对特定类型的模板特化,对于该类型的参数调用会优先使用这个特化版本。
- 根据模板实参推导:编译器尝试根据传入的实参来推导模板参数。如果对不同的模板函数,模板实参推导的结果不同,就会选择不同的函数。
- 匹配度:更匹配的模板函数会被选择。例如,对于指针类型,如果有一个模板函数专门针对指针参数,而另一个是针对一般类型参数,对于指针实参,针对指针的模板函数更匹配。
- 对于
func(new int(5));
调用的分析:- 会调用
template <typename T> void func(T* a);
函数。 - 原因是
new int(5)
返回一个int*
类型的指针。对于template <typename T> void func(T a);
,模板参数T
会被推导为int*
,此时a
是int*
类型。而对于template <typename T> void func(T* a);
,模板参数T
会被推导为int
,此时a
同样是int*
类型。但是template <typename T> void func(T* a);
模板函数专门针对指针类型,与int*
实参的匹配度更高,所以会调用template <typename T> void func(T* a);
函数。
- 会调用