[C++][模板]char*作为模板实参时的一个问题

当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页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值