您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: