#include <iostream>
using namespace std;
template<typename T>
void fun(T t)
{
cout << "match T" << endl;
}
template<>
void fun(int const& t)
{
cout <<"match int const & "<<endl;
}
int main(int argc, char* argv[])
{
const int x =12;
const int& y =x;
fun(x); //why not the second?
fun(y); //why?
fun(4);//why?
return 0;
}
Output:
match T
match T
match T
我们知道在函数模板重载解析后,编译器应该从所选的基函数模板中选择最佳匹配特化吗? 什么是规则?
答案 0 :(得分:0)
这是两个不同的模板!
你想做的是
template<>
void fun<const int>(const int& t)
{
cout << "match const int & " << endl;
}
注意两件事:
const type
和type const
原则上是两件不同的事情;当type
是一个指针(它是一个常量指针还是一个指向常量的指针?)时,这会变得毛茸茸! 此外,正如评论已经指出的那样,没有充分的理由在这里使用模板。一个简单的重载函数就可以了。
答案 1 :(得分:0)
您可以在T
= int const&
时专门针对案例设置模板。但是,根据模板参数推导的规则,推导出int
(并且实例化主模板)。
相反,通过编写int const&
的非模板函数来重载。 (直接引用绑定具有完全匹配等级,因此应选择该功能。)