我有一个循环,它使用以下命令读取文件中的每一行getline()
:
istream is;
string line;
while (!getline(is, line).eof())
{
// ...
}
我注意到这样的调用getline()
似乎也有效:
while (getline(is, line))
这里发生了什么?getline()
返回一个流引用。它是否以某种方式转换为指针?这实际上是一个好习惯还是我应该坚持第一种形式?
istream
返回的方法getline()
是隐式调用其运算符void*()
方法,该方法返回流是否遇到错误。因此,它进行的检查比调用eof()
.
更新:
我错误地指出了 basic_istream::sentry 类上 operator bool() 方法的basic_istream 文档,但正如已经指出的那样,这实际上并不是正在发生的事情。我投票赞成查尔斯和卢克的正确答案。它实际上是被调用的操作符 void*()。C++ 常见问题解答中对此的更多信息。
查尔斯确实给出了正确答案。
所谓的确实是std::basic_ios::operator void*()
,而不是,这与返回 a (因此, a )而不是哨兵sentry::operator bool()
的事实一致。std::getline()
std::basic_istream
std::basic_ios
对于非信徒,请参阅:
否则,正如其他人已经说过的,更喜欢规范的第二种形式。如果fail()
你真的想要一个冗长的代码,就不要使用——我不记得是否xxx.good()
可以用来代替!xxx.fail()
我会坚持第一种形式。虽然第二种形式可能有效,但它几乎不明确。您的原始代码清楚地描述了正在执行的操作以及预期的行为方式。