unspecified-bool-type
2015-09-25 23:29
447 查看
类boost::scoped_ptr的源码中有如下声明:
operator unspecified-bool-type() const;
这是个到unspecified-bool-type类型的隐式转换函数,它可以在Boolean上下文中测试一个智能指针。如果shared_ptr保存着一个有效的指针,返回值为True;否则为false。注意,转换函数返回的类型是不确定的。把返回类型当成bool用会导致一些荒谬的操作,所以典型的实现采用了safe bool idiom,它很好地确保了只有可适用的Boolean测试可以使用。这个函数不会抛出异常。
safe bool idiom
这个就是传说中的布尔类型转换操作符号:
当我们使用if(p) 这个来检测一个p(可以是一个变量也可以是一个自己定义的类型),如果是变量很简单,如果是类型就要使用到类型的BOOL 类型转换操作符号了
safe bool idiom的起源来自于这样子的一种用法:if( obj ) { ... },对于obj是built-in类型,那自然行得通,但是对于一个class或者struct就并不总是可以了。当然可以通过这样子的用法来代替:if( obj.is_valid() ){},问题很明显,第一烦琐,第二通用性不够,也许应该使用obj.Valid()或者obj.Empty()之类的,这与template结合起来考虑是尤其是个问题。因此我们希望有一个解决方案是的我们直接可以写下if(obj)这样的语句。
初初一想,这很简单,重载operator bool不就可以了,又或者重载operator void*?是的,这两个方法确确实实使得我们可以使用if(obj)这样的语句了,但是仔细推敲的话就会发现有很多问题。
再看一个问题:
第一次看到while(cin)这种循环条件,把他改成了while(1)效果也是一样,那到底两个有什么区别呢?
while后面都是对循环的条件的检测,cin不是bool,cin是个istream类型的对象,而istream重载了operator void*(),指针类型是可以进行判断的,0指针为false,非0为true。
至于为什么用void*而不用bool,是bool几乎可以隐式转成其它各种类型,因此容易引发各种让人奇怪的转换甚至隐藏程序错误,比如转换成char:
char c = cin;
再比如:
putchar(cin);
这看上去太奇特了,所以operator bool()不好,改用operator void*()了。
看这里:http://www.artima.com/cppsource/safeboolP.html
参考:
http://blog.csdn.net/hityct1/article/details/3923074 http://www.cnblogs.com/hujian/archive/2012/12/10/2810754.html
operator unspecified-bool-type() const;
这是个到unspecified-bool-type类型的隐式转换函数,它可以在Boolean上下文中测试一个智能指针。如果shared_ptr保存着一个有效的指针,返回值为True;否则为false。注意,转换函数返回的类型是不确定的。把返回类型当成bool用会导致一些荒谬的操作,所以典型的实现采用了safe bool idiom,它很好地确保了只有可适用的Boolean测试可以使用。这个函数不会抛出异常。
safe bool idiom
这个就是传说中的布尔类型转换操作符号:
当我们使用if(p) 这个来检测一个p(可以是一个变量也可以是一个自己定义的类型),如果是变量很简单,如果是类型就要使用到类型的BOOL 类型转换操作符号了
safe bool idiom的起源来自于这样子的一种用法:if( obj ) { ... },对于obj是built-in类型,那自然行得通,但是对于一个class或者struct就并不总是可以了。当然可以通过这样子的用法来代替:if( obj.is_valid() ){},问题很明显,第一烦琐,第二通用性不够,也许应该使用obj.Valid()或者obj.Empty()之类的,这与template结合起来考虑是尤其是个问题。因此我们希望有一个解决方案是的我们直接可以写下if(obj)这样的语句。
初初一想,这很简单,重载operator bool不就可以了,又或者重载operator void*?是的,这两个方法确确实实使得我们可以使用if(obj)这样的语句了,但是仔细推敲的话就会发现有很多问题。
再看一个问题:
第一次看到while(cin)这种循环条件,把他改成了while(1)效果也是一样,那到底两个有什么区别呢?
while后面都是对循环的条件的检测,cin不是bool,cin是个istream类型的对象,而istream重载了operator void*(),指针类型是可以进行判断的,0指针为false,非0为true。
至于为什么用void*而不用bool,是bool几乎可以隐式转成其它各种类型,因此容易引发各种让人奇怪的转换甚至隐藏程序错误,比如转换成char:
char c = cin;
再比如:
putchar(cin);
这看上去太奇特了,所以operator bool()不好,改用operator void*()了。
看这里:http://www.artima.com/cppsource/safeboolP.html
参考:
http://blog.csdn.net/hityct1/article/details/3923074 http://www.cnblogs.com/hujian/archive/2012/12/10/2810754.html
相关文章推荐
- Windows10上不去网怎么办
- Scala深入浅出进阶经典 第59讲:Scala中隐式转换初体验实战详解以及隐式转换在Spark中的应用源码解析
- iOS开发多线程-线程间通讯
- HTML与CSS
- JavaScript高级程序设计之基本概念之变量第3.3讲笔记
- Memcache与MySQL并肩作战
- Scala深入浅出进阶经典 第58讲:Scala中Abstract Types实战详解
- Android 四种基本布局LinearLayout、RelativeLayout、FrameLayout、TableLayout
- linux之sed用法
- Servlet常用类
- IT菜鸟的未来规划
- noip2010 三国游戏 (博弈论)
- 第107讲:Akka中的Future使用代码实战详解学习笔记
- 【Android杂谈】AsyncTask的详细使用解析
- Scala深入浅出进阶经典 第57讲:Scala中Dependency Injection实战详解
- Struts2 用通配符方式动态调用方法
- 读《大道至简》有感(二)
- 32位的VS通过odbc数据源访问64位Oracle
- <含泪活着>-观后感
- POJ 1321 棋盘问题