我有一个使用getline()读取文件中每一行的循环。std :: getline()返回
istream is;
string line;
while (!getline(is, line).eof())
{
}
我注意到,调用函数getline()这样也似乎工作:
while (getline(is, line))
这是怎么回事? getline()返回一个流引用。它以某种方式被转换为指针吗?这实际上是一种好的做法,还是应该坚持第一种形式?
我有一个使用getline()读取文件中每一行的循环。std :: getline()返回
istream is;
string line;
while (!getline(is, line).eof())
{
}
我注意到,调用函数getline()这样也似乎工作:
while (getline(is, line))
这是怎么回事? getline()返回一个流引用。它以某种方式被转换为指针吗?这实际上是一种好的做法,还是应该坚持第一种形式?
getline()返回的istream隐式调用其操作符void *()方法,该方法返回流是否已经遇到错误。因此它比eof()的调用进行更多的检查。
更新时间:
我曾误指着basic_istream documentation有关basic_istream ::哨兵类运营商布尔()方法,但由于已经指出,这不是真正发生了什么。我已经投票支持查尔斯和吕克的正确答案。它实际上是运算符void *()被调用。更多关于这个in the C++ FAQ。
我会坚持第一种形式。虽然第二种形式可能有效,但它并不明确。您的原始代码清楚地描述了正在进行的操作以及预期的操作方式。
Charles确实给了correct answer。
什么叫确实是std::basic_ios::operator void*()
,而不是sentry::operator bool()
,这是洽与事实std::getline()
返回std::basic_istream
(因此,std::basic_ios
),而不是一个哨兵。
对于非信徒,见:在cppreference网站
否则,正如其他人已经说过,更喜欢第二种形式whic h是规范的。如果真的需要详细代码,请不要使用fail()
- 我永远不会记得是否可以使用xxx.good()
而不是!xxx.fail()
查尔斯是对的,你也对哨兵提供的操作员感到困惑。 – 2008-11-03 17:42:34