为什么即使 std::getline 不返回布尔值,while(std::getline) 循环也能工作?

问题描述

我见过很多这样的循环来读取流:

while(std::getline(iss,temp,' ')) {
    ...
}

但我一直不明白它为什么有效。在 documentation for std::getline 中,它说它返回流,我不明白它是如何转换为 bool 值的。它是在读取 eof 标志还是什么?如果是这样,这会不会更准确:

while(!iss.eof()) {
    std::getline(iss,' ');
}

解决方法

while 语句不需要专门用于其条件表达式的 bool。它们需要一种可转换为 bool 的类型。

std::getline 返回派生自 a typestd::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()) {
    ...
}