テキスト ファイルから行を読み取る標準的な方法は次のとおりです。
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*() const
std::basic_ios
fail
[C++03: 27.4.4]
&[C++03: 27.4.4.3/1
]を参照してください
- C++11 では、ストリームは in を介して に変換され、エラー フラグが設定されたときに
bool
に評価 されます。explicit operator bool() const
std::basic_ios
false
fail
- 見る
[C++11: 27.5.5.1]
&[C++11: 27.5.5.4/1]
- 見る
C++03 では、このメカニズムは次のことが可能であることを意味します。
std::cout << std::cout;
これにより、任意のポインタ値が標準出力ストリームに出力されます。
ただし、operator void*() const
C++11 で削除されたにもかかわらず、これは C++11 モードの GCC 4.7.0 でもコンパイルおよび実行されます。
これは C++11 でもどのように可能ですか? 私が気付いていない他のメカニズムが働いているのでしょうか? それとも単に実装の「奇妙さ」ですか?