zoukankan      html  css  js  c++  java
  • 提防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做特殊处理。

  • 相关阅读:
    asp之缓存 cachestate
    ASP。net 之view
    ASP.net gridview之性别
    asp的gridview
    yii源码学习心得2
    yii源码学习心得
    什么是伪静态?伪静态有何作用?
    Yii2.0 时间日期插件之yii2-timepicker
    yii中调整ActiveForm表单样式
    8个新鲜的PHP常用代码
  • 原文地址:https://www.cnblogs.com/huqingyu/p/52551.html
Copyright © 2011-2022 走看看