質問
getline()
を使用してファイルの各行を読み取るループがあります:
istream is;
string line;
while (!getline(is, line).eof())
{
// ...
}
このように getline()
を呼び出すことも機能するように見えることに気付きました:
while (getline(is, line))
ここで何が起こっているのですか? getline()
はストリーム参照を返します。それは何らかの形でポインタに変換されていますか?これは実際には良い習慣ですか、それとも最初の形式に固執すべきですか?
解決
getline()
によって返される istream
には、演算子 void *()
メソッドが暗黙的に呼び出され、ストリームが実行されたかどうかを返しますエラーに。そのため、 eof()
の呼び出しよりも多くのチェックを行っています。
他のヒント
更新:
誤って basic_istream :: sentryクラスの演算子bool()メソッドのbasic_istreamドキュメンテーションが、指摘されているように、これは実際には何が起こっているかではありません。チャールズとリュックの正解に投票しました。実際に呼び出されるのは、演算子void *()です。詳細については、 C ++ FAQ をご覧ください。
チャールズは正解を返しました。
実際に呼び出されるのは std :: basic_ios :: operator void *()
であり、 sentry :: operator bool()
ではなく、事実と一致しています。 std :: getline()
は、歩ryではなく、 std :: basic_istream
(したがって、 std :: basic_ios
)を返します。
信者でない人については、以下を参照してください:
- std :: basic_ios :: operator void *() cppreferenceサイトのドキュメント、
- artimaに関する The Safe Bool Idiom の記事、
- C ++ FAQ lite§ 15.4 、
- 標準、...
それ以外の場合、他の人がすでに言ったように、正規の2番目の形式を好む。本当に冗長なコードが必要な場合は、 fail()
を使用しないでください-!xxx.fail()の代わりに
xxx.good()
を使用できるかどうか覚えていません)
最初のフォームに固執します。 2番目の形式は機能しますが、ほとんど明示的ではありません。元のコードは、何が行われ、どのように動作することが期待されるかを明確に説明しています。