std::getline() 返回值是什么?

25

我有一个循环,使用 getline() 读取文件中的每一行:

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

我注意到像这样调用getline()似乎也可以工作:

while (getline(is, line))

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

4个回答

27
< p > getline()返回的istream对象将隐式调用其操作符void*()方法,该方法返回流是否遇到错误。因此,它进行了比调用eof()更多的检查。< /p >

Charles是正确的,你也被sentry提供的运算符所困惑了。 - Luc Hermitte
在我写测试的时候误删了我的上一篇文章。现在我非常确定它转换成了布尔值。 - Martin York
除非您的SL实现是非标准的,否则它会转换为void*。这是标准要求的。 - Luc Hermitte
我有标准的在线(草案)版本的副本。你引用的是哪里?请看下面我的帖子。如果我们能够将其确定为标准中的某个段落,我会非常高兴被纠正。 - Martin York
1
C++0x对于"operator unspecified-bool-type() const;"的确切定义没有做出规定(§27.4.4.3/1)。而C++98则定义了"operator void*() const;"。如果你仔细看,就会发现并没有"operator bool()const"。你可能会将其与"basic_istream::sentry::operator bool()const"(§27.6.1.1.3/8)混淆。 - Luc Hermitte

8

更新:

我错误地指向了basic_istream::sentry类的operator bool()方法的文档,但正如其他人所指出的那样,实际上并非如此。 我投票支持Charles和Luc的正确答案。 实际上是调用operator void*()。 更多相关信息请参见C++ FAQ


你正在将sentry与basic_ios :: operator void ()混淆 -> http://dinkumware.com/manuals/default.aspx?manual=compleat&page=ios.html#basic_ios::operator%20void%20 - Luc Hermitte

5

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

所调用的函数确实是std::basic_ios::operator void*(),而不是sentry::operator bool(),这与std::getline()返回std::basic_istream(因此是一个std::basic_ios)而不是sentry的事实一致。

对于不信者,请参见:

否则,正如其他人已经说过的那样,建议使用第二种形式,这是规范的。只有在您真正需要冗长的代码时才使用fail(),如果我记得不清楚是否可以使用xxx.good()代替!xxx.fail()


确实。dinkumware已经删除了其在线文档。链接已修复。谢谢。 - Luc Hermitte

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

流可能不好并且不是 eof(),如果您想明确一点,可以调用 good()。 - Todd Gamblin
是的,你说得对。最好使用第一种形式,但调用.good()而不是.eof()。 - e.James
2
个人而言,我喜欢使用隐式转换为bool。它看起来像其他迭代行的语言一样。 - Martin York

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接