std :: getline()返回

Fer*_*cio 25 c++ getline

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

istream is;
string line;
while (!getline(is, line).eof())
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

while (getline(is, line))
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*son 27

istream通过返回getline()由具有其操作void*()方法隐含地调用,返回该流是否已碰到一个错误.因此,它比调用更多的支票eof().


Tod*_*lin 8

更新:

我错误地指出,basic_istream文档有关basic_istream ::哨兵类运营商布尔()方法,但由于已经指出,这不是真正发生了什么.我已经投了查尔斯和吕克的正确答案.它实际上是操作符void*()被调用.更多关于C++ FAQ的内容.

  • 你的链接已经死了 (2认同)

Luc*_*tte 5

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

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

对于非信徒,请参阅:

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