问题描述
我见过很多这样的循环来读取流:
while(std::getline(iss,temp,' ')) {
...
}
但我一直不明白它为什么有效。在 documentation for std::getline 中,它说它返回流,我不明白它是如何转换为 bool 值的。它是在读取 eof 标志还是什么?如果是这样,这会不会更准确:
while(!iss.eof()) {
std::getline(iss,' ');
}
解决方法
while
语句不需要专门用于其条件表达式的 bool
。它们需要一种可转换为 bool 的类型。
std::getline
返回派生自 a type 的 std::basic_ios
,即 convertible to bool
。
std::getline
继承 std::basic_istream
,继承 std::basic_ios
,实现 std::basic_ios<CharT,Traits>::operator bool。
while
需要一个 bool 结果表达式,因此
while(std::getline(iss,temp,' ')) {
...
}
是由编译器在后台尝试的,例如
while(static_cast<bool>(std::getline(iss,' '))) {
...
}
并且转换成功执行
while(std::getline(iss,' ').operator bool()) {
...
}