テキスト ファイルから行を読み取る標準的な方法は次のとおりです。
std::fstream fs("/tmp/myfile.txt");
std::string line;
while (std::getline(line, fs)) {
doThingsWith(line);
}
(いいえ、そうではありません while (!fs.eof()) { getline(line, fs); doThingsWith(line); }!)
これstd::getlineは、参照によってストリーム引数を返すため、次の理由で機能します。
- C++03 では、エラー フラグが設定され
ている場合、ストリームはin
void*を介してに変換され、null ポインター値に評価されます。operator void*() conststd::basic_iosfail[C++03: 27.4.4]&[C++03: 27.4.4.3/1]を参照してください
- C++11 では、ストリームは in を介して に変換され、エラー フラグが設定されたときに
boolに評価 されます。explicit operator bool() conststd::basic_iosfalsefail- 見る
[C++11: 27.5.5.1]&[C++11: 27.5.5.4/1]
- 見る
C++03 では、このメカニズムは次のことが可能であることを意味します。
std::cout << std::cout;
これにより、任意のポインタ値が標準出力ストリームに出力されます。
ただし、operator void*() constC++11 で削除されたにもかかわらず、これは C++11 モードの GCC 4.7.0 でもコンパイルおよび実行されます。
これは C++11 でもどのように可能ですか? 私が気付いていない他のメカニズムが働いているのでしょうか? それとも単に実装の「奇妙さ」ですか?