stream&对象到bool的转换小结(C++11的safe-bool)

在我们日常使用C++的各种场景中,通过while(cin>>num),while(getline(cin,str))这种来判断输入是很常见的。那么这种istream对象到bool的转换具体是怎么实现的呢。

1.旧版实现

这里会不会是直接在istream类中直接定义bool的类型转换呢——形如operator bool (){ };

很遗憾,并没有这么简单。因为我们知道,bool型会自动类型提升为int型,所以直接定义operator bool ()之后。

cout<<2这种表达式,编译器不知道将他转换为bool(cout)<<2这种移位操作还是输出操作。

所以以前的C++标准采用了一个替代的方法,定义operator void * (){ }; 即定义转换为void*类型的指针,因为可以通过判断指针是否为nullptr来转换为bool。

但这种方法也有一定的问题,比如说允许了delete std::cout或char  c  =  cin;这种语句的编译通过。

2.C++11的safe-bool

所以C++11引入了safe-bool,即将explicit关键字扩充到可以修饰转换类型函数——explicit operator bool() const;

使得对象只有在上下文需要判断bool条件的时候才会自动转换为bool类型。

if,while,for(§6.4 [stmt.select] p4)

binary logical operators&&and||(§5.14 [expr.log.and/or] p1for both)

the logical negation operator!(§5.3.1 [expr.unary.op] p9)

conditional operator?:(§5.14 [expr.cond] p1)

static_assert(§7 [dcl.dcl] p4)

noexcept(§15.4 [except.spec] p2)

注意,bool f=cin;不能通过编译,因为不是需要判断的情况。

参考

Why operator void*() conversion function added to the C++ stream classes?

Is the safe-bool idiom obsolete in C++11?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值