我有一个循环,使用以下方法读取文件中的每一行getline()
:
istream is; string line; while (!getline(is, line).eof()) { // ... }
我注意到这样调用getline()
似乎也有效:
while (getline(is, line))
这里发生了什么?getline()
返回流引用.是以某种方式转换为指针?这实际上是一种很好的做法还是我应该坚持第一种形式?
在istream
通过返回getline()
由具有其操作void*()
方法隐含地调用,返回该流是否已碰到一个错误.因此,它比调用更多的支票eof()
.
更新:
我错误地指出,basic_istream文档有关basic_istream ::哨兵类运营商布尔()方法,但由于已经指出,这不是真正发生了什么.我已经投了查尔斯和吕克的正确答案.它实际上是操作符void*()被调用.更多关于C++ FAQ的内容.
查尔斯确实给出了正确答案.
所谓的确是std::basic_ios::operator void*()
,而不是sentry::operator bool()
,它与std::getline()
返回a std::basic_istream
(因此,a std::basic_ios
)而不是哨兵的事实是一致的.
对于非信徒,请参阅:
cppreference网站上的std :: basic_ios :: operator void*()文档,
关于artima 的The Safe Bool Idiom文章,
C++ FAQlite§15.4,
标准, ...
否则,正如其他人已经说过的那样,更喜欢规范的第二种形式.fail()
如果你真的想要一个冗长的代码,请不要使用- 我永远不会记得是否xxx.good()
可以使用代替!xxx.fail()