引用类型实参和非引用类型实参对于字符串可能存在的问题

#include <string>

//注意:引用参数
template<typename T>
inline T const& max(T const& a, T const& b)
{
return a < b ? b : a;
}

int main()
{
string s;
::max("apple", "peach"); //OK:相同类型的实参
::max("apple", "tomato"); //ERROR:不同类型的实参
::max("apple", s); //ERROR:不同类型的实参
}
问题在于:由于长度的区别,这些字符串属于不同的数组类型。
也就是说,“apple”,“peach”具有相同的类型char const[6],而“tomato”的类型则是char const[7],因此只有第一个调用是合法的。
       然而如果声明是的非引用参数,就可以使用不同的字符串来作为max()的参数:
#include <string>
//注意:非引用参数
template<typename T>
inline T  max(T  a, T  b)
{
    return a < b ? b : a;
}

int main()
{
    string s;
    ::max("apple", "peach");   //OK:相同类型的实参
    ::max("apple", "tomato");  //OK:退化为相同的类型
    ::max("apple", s);         //ERROR:不同类型的实参
}
产生这种调用结果的原因是:对于非引用类型的参数,在实参演绎的过程中,会出现数组到指针的类型转换
         如果你遇到一个关于字符数组和字符串指针之间不匹配的问题,你会意外地发现和这个问题一定会有相似指出,然而遗憾的是,对于这个问题并没有通用的解决方法,根据不同的情况,可以采用以下几种方式:
  • 使用非引用参数取代引用参数(然而,这可能会导致无用的拷贝)
  • 进行重载,编写接收引用参数和非引用参数的两个重载函数(然而,这可能会导致二义性)
  • 对具体类型进行重载
  • 强制应用程序员使用显式类型转化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值