当char*作为模板时,不同长度的字符串可能会被编译器认为是不同的两种模板类型实参,即:
char* s1 = "abcd";
char* s2 = "efghijkl";
templace <typename T>
int max(T const& t1, T const& t2)
{
return (t1 > t2) ? : t1 : t2;
}
int main()
{
int maxval = max(s1, s2); // 编译报错,不同类型的实参
}
当使用s1和s2作为max模板函数的实参演绎的时候,编译器会将s1的类型认为是char[5],而s2的类型认为是char[9],而max模板函数只接受一种类型作为模板参数,所以此处会报错。
但是如果将模板函数申明中的引用去除:
int max(T const t1, T const t2)
{
return (t1 > t2) ? : t1 : t2;
}
编译则可以通过,没有问题。
因为对于非应用类型的模板函数参数,编译器会做数组到指针的类型转换(decay),通过转换后,两个模板函数实参类型都变为char*了。
该范例和注意点来自《C++ Template》第52页