Jery最早的意图是支持一个iostream class object的纯量测试,像这样:
if ( cin )...
为了让cin能够求得一个真假值,Jerry首先为它定义一个conversion运算符,即operator int()。在良好行为如上者,确实 可以正确运行。但是在下面这种错误程序设计中,它的行为就会令人不解:
cin<<intVal;
程序员要的应该是cout而不是cin。class层次结构的"type-safe"天性应该能够捕捉这类输出运算符的错误运用。然而,编译器可能这样做:
int temp = cin.operator int();
temp << intVal;
这不是我们想要的。
如何解决这个行为?Jerry想到以operator void *()取代operator int()。
operator void*() 意义:stream是否出错(相当于!fail())
operator !() 意义:stream是否已出错(相当于fail())
我们可以运用operator void*()在控制结构中简洁测出stream的当前状态:
while (std::cin){
...
}
控制结构中的布尔条件值并不是非得直接转换为bool不可,只要能够转换为某个整数型别或指针型别就够了。
如果用cin读取一个整型量而输入的却是个字符, cin就会设置一个failbit来表示失效位, operator void* 在流状态正常时返回1, operator !返回0。