25

我有一个循环,它使用以下命令读取文件中的每一行getline()

istream is;
string line;
while (!getline(is, line).eof())
{
    // ...
}

我注意到这样的调用getline()似乎也有效:

while (getline(is, line))

这里发生了什么?getline()返回一个流引用。它是否以某种方式转换为指针?这实际上是一个好习惯还是我应该坚持第一种形式?

4

4 回答 4

27

istream返回的方法getline()是隐式调用其运算符void*()方法,该方法返回流是否遇到错误。因此,它进行的检查比调用eof().

于 2008-11-03T17:02:45.743 回答
8

更新:

我错误地指出了 basic_istream::sentry 类上 operator bool() 方法的basic_istream 文档,但正如已经指出的那样,这实际上并不是正在发生的事情。我投票赞成查尔斯和卢克的正确答案。它实际上是被调用的操作符 void*()。C++ 常见问题解答中对此的更多信息。

于 2008-11-03T17:02:04.980 回答
5

查尔斯确实给出了正确答案

所谓的确实是std::basic_ios::operator void*(),而不是,这与返回 a (因此, a )而不是哨兵sentry::operator bool()的事实一致。std::getline()std::basic_istreamstd::basic_ios

对于非信徒,请参阅:

否则,正如其他人已经说过的,更喜欢规范的第二种形式。如果fail()你真的想要一个冗长的代码,就不要使用——我不记得是否xxx.good()可以用来代替!xxx.fail()

于 2008-11-03T18:01:33.613 回答
-3

我会坚持第一种形式。虽然第二种形式可能有效,但它几乎不明确。您的原始代码清楚地描述了正在执行的操作以及预期的行为方式。

于 2008-11-03T17:06:37.093 回答