我有一個使用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