为什么istream对象可以用作bool表达式
Why istream object can be used as a bool expression?
有人知道为什么istream对象可以用作bool表达式吗?例如:
ifstream input("tmp");
int iValue;
while (input >> iValue)
//do something;
这里input >> iValue
返回对ifstream对象的引用。我想知道为什么这个对象可以用作bool表达式。
我查看了ifstream类,发现这可能是由于以下成员函数:
operator void * ( ) const;
查看此函数的详细信息。
如果是,谁能给我解释一下这个函数?这个函数的原型不同于通常的操作符重载声明。这个函数的返回类型是什么?
如果不是,那么ifstream对象可以用作bool表达式的原因是什么?
期待您的帮助!
在c++ 11中改变了将istream用作布尔表达式的确切机制。正如你所发现的,以前它是对void*
的隐式转换。在c++ 11中,它将explicit
转换为bool
。
允许在布尔表达式中使用istream或ostream,以便c++程序员可以继续使用具有副作用的表达式作为while
或for
循环的条件:
SomeType v;
while( stream >> v )
{
// ...
}
程序员这样做的原因是,它提供了更简洁的代码,代码更容易理解,比例如. ...
for( ;; )
{
SomeType v;
stream >> v;
if( stream.fail() )
{
break;
}
// ...
}
然而,在某些情况下,甚至这样一个冗长的结构也是可取的。这取决于. 这是对给定类型的强制转换操作符。operator T ()
是转换为t类型的操作符,在if
语句中,ifstream
被转换为void*
,然后void*
被转换为bool
。
相关文章:
- 写入向量<向量<bool>>
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- C bool表达式作为函数参数调用错误的超载
- 在 lambda 表达式中自动推导出的类型是什么,用于修改 bool 类型的向量(特殊容器)
- When是bool a|=mayRun()的右手表达式;正在执行
- "bool"之前的预期主要表达式
- 在类方法上使用指针:表达式的类型必须为bool错误
- 在表达式 bool <<整数中,bool 是提升为 int,还是提升为与整数相同的类型?
- 为什么istream对象可以用作bool表达式
- 结构错误表达式必须为bool类型