C++标准库笔记:13.4.3 Stream状态与布尔条件测试

本文探讨了C++中流条件测试的实现原理,解释了为何选择重载void*而非bool类型,并给出了使用建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

流条件测试

int a = 0;
while( (std::cin >> a) )
{
    cout << a << endl;
}

以上代码得以使用std::cin来做条件测试,是因为Stream在类ios_base内定义了两个可用于布尔表达式的函数,

__CLR_OR_THIS_CALL operator void *() const
    {   // test if any stream operation has failed
        return (fail() ? 0 : (void *)this);
    }

bool __CLR_OR_THIS_CALL operator!() const
    {   // test if no stream operation has failed
        return (fail());
    }

以上有个疑惑,为什么要重载void*,而不直接重载bool呢?
原来是因为流对操作符<<和>>做了重载,如果重载operator bool()的话,此处就会出现bool << 和 bool >>的情况,这是一种移位操作,同流操作符<<和>>产生了二义性。因此标准库就只能退而求其次,重载operator void*代替operator bool了(这些都是站在c++98的基础上说的,c++11已经不一样了,具体可看此处

operator !()使用注意事项

我们可以使用!操作符来对流进行测试,如下

int a = 0;
do
{
    if ( !(cin >> a) )
    {
        break;
    }
    cout << a << endl;
}while( true );

其中!操作符之后的小括号是必须的,因为!操作符的优先级高于 >>

使用建议

使用转换为布尔的方式,即使用operator void* 与operator !(),会引起编程风格的争论。通常,使用诸如fail()这样的有较佳可读性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值