您的位置:首页 > 其它

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

2017-09-01 18:37 337 查看
#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:不同类型的实参

}

[align=justify]问题在于:由于长度的区别,这些字符串属于不同的数组类型。[/align]

[align=justify]也就是说,“apple”,“peach”具有相同的类型char const[6],而“tomato”的类型则是char const[7],因此只有第一个调用是合法的。[/align]
[align=justify]       然而如果声明是的非引用参数,就可以使用不同的字符串来作为max()的参数:[/align]

#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:不同类型的实参

}

产生这种调用结果的原因是:对于非引用类型的参数,在实参演绎的过程中,会出现数组到指针的类型转换

         如果你遇到一个关于字符数组和字符串指针之间不匹配的问题,你会意外地发现和这个问题一定会有相似指出,然而遗憾的是,对于这个问题并没有通用的解决方法,根据不同的情况,可以采用以下几种方式:

使用非引用参数取代引用参数(然而,这可能会导致无用的拷贝)
进行重载,编写接收引用参数和非引用参数的两个重载函数(然而,这可能会导致二义性)
对具体类型进行重载
强制应用程序员使用显式类型转化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐