引用类型实参和非引用类型实参对于字符串可能存在的问题
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:不同类型的实参
}
产生这种调用结果的原因是:对于非引用类型的参数,在实参演绎的过程中,会出现数组到指针的类型转换
如果你遇到一个关于字符数组和字符串指针之间不匹配的问题,你会意外地发现和这个问题一定会有相似指出,然而遗憾的是,对于这个问题并没有通用的解决方法,根据不同的情况,可以采用以下几种方式:
使用非引用参数取代引用参数(然而,这可能会导致无用的拷贝)
进行重载,编写接收引用参数和非引用参数的两个重载函数(然而,这可能会导致二义性)
对具体类型进行重载
强制应用程序员使用显式类型转化
//注意:引用参数
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:不同类型的实参
}
产生这种调用结果的原因是:对于非引用类型的参数,在实参演绎的过程中,会出现数组到指针的类型转换
如果你遇到一个关于字符数组和字符串指针之间不匹配的问题,你会意外地发现和这个问题一定会有相似指出,然而遗憾的是,对于这个问题并没有通用的解决方法,根据不同的情况,可以采用以下几种方式:
使用非引用参数取代引用参数(然而,这可能会导致无用的拷贝)
进行重载,编写接收引用参数和非引用参数的两个重载函数(然而,这可能会导致二义性)
对具体类型进行重载
强制应用程序员使用显式类型转化
相关文章推荐
- 字符串对于连续的空格只保留一个类型问题
- (php的弱类型导致的小问题)某变量可能是数字或非数字(对象、字符串、json等)时,应该如何去判断
- (php的弱类型导致的小问题)某变量可能是数字或非数字(对象、字符串、json等)时,应该如何去判断
- 关于值类型、引用类型和字符串类型的比较问题!通过实例来说明!
- 引用类型参数的初始化及可能出现的问题
- Mysql等数据库对于版本号类型字符串的比较问题的思考
- c#:未将对象引用设置到对象的实例--可能出现的问题总结(转)
- 对于存在问题的改进
- 由最近值类型和引用类型探讨想到的一些问题
- "const char*"类型的实参与LPCTSTR类型的形参不兼容问题
- Go内建函数(对于引用类型) new 和 make 的区别
- 【Url编码问题】命名空间“System.Web”中不存在类型或命名空间名称“HttpUtility”。是否缺少程序集引用?
- 引用类型的赋值问题--.net 中的Deep Clone
- Struts2对于BigDecimal类型的转换问题
- 【.NET版月经问题】之二【引用类型参数就是按引用传递吗?】
- c# ref关键字对于引用类型传递的影响
- 未将对象引用设置到对象的实例--可能出现的问题总结
- C#对于字符串类型string和StringBuilder的使用
- php在foreach中使用引用赋值&可能遇到的问题
- CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义----问题解决办法