提防iostream使用中的一个“陷阱”

 

先看下面的示例代码:
template < typename T > void test()
{
 T o;
 for(T i = numeric_limits< T >::min(); i < numeric_limits< T >::max(); ++i)
 {
  stringstream stream;
  stream << i;
  stream >> o;
  assert(i == o);
 }
}

试着按下面这样调用它:
test< int >();
一点问题都没有。

再这样调用:
test< char >();
你会发现当i=9的时候,assert在大声地“抱怨”,这种情况下,我们受了stream“放进去什么,拿出来也是什么”的假相的迷惑,往stream放进去一个(char)9,是拿不出来任何东西的!

或许你说,“好的,我知道了,stream对字符的处理和数值的处理不一样”,我们再来看一个例子:
test< BYTE >();
这种情况下,我们一样的被BYTE迷惑了,BYTE是我们一厢情愿定义的“数值”类型,实际上,只是一个unsigned char而已,会被iostream当作char一样处理。

注:上面的例子只在VC 7.1下、用MS版的STL测试过,别的版本的STL会如何处理char和BYTE,我自己没有测试过,不敢下结论。

另外,我注意到boost::lexical_cast(V 1.31.0)也没有对char和BYTE做特殊处理。

原文地址:https://www.cnblogs.com/huqingyu/p/52551.html