std :: getline()返回

问题描述 投票:25回答:4

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

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

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

while (getline(is, line))

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

c++ getline
4个回答
27
投票

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


8
投票

更新:

我错误地指出了在basic_istream :: sentry类上运算符bool()方法的basic_istream documentation,但正如已经指出的那样,实际上并没有发生什么。我已经投了查尔斯和吕克的正确答案。它实际上是操作符void *()被调用。更多关于这个in the C++ FAQ


5
投票

查尔斯确实给了correct answer

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

对于非信徒,请参阅:

  • 关于cppreference网站的std::basic_istream *()文档,
  • 关于artima的std::basic_ios文章,
  • std::basic_ios::operator void
  • 标准, ...

否则,正如其他人已经说过的那样,更喜欢规范的第二种形式。如果你真的想要一个冗长的代码,请使用The Safe Bool Idiom - 我永远不会记得是否可以使用C++ FAQ lite §15.4代替fail()


-3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.