stringstream がなぜ機能するのか >> C 11 以降の抽出失敗時にターゲット値を変更する?
Stroustrup の「TC PL」では、istream または ostream 操作が失敗した場合、ターゲット変数の値は変更されないままである必要があると規定されています。ただし、これは stringstream で観察された動作と矛盾します。
#include <iostream> #include <sstream> int main() { std::stringstream ss; int v = 123; ss << "The quick brown fox."; if (ss >> v) { std::cout << "Unexpected success in reading a word into an int!\n"; } std::cout << "After extraction failure: " << v << "\n"; return 1; }
このコードは、Strroustrup の主張にもかかわらず、「抽出失敗後: 0」を出力します。
C 11 動作の変更
この矛盾は、C 11 以降の stringstream の動作の変更に起因します。C より前11 では、stringstream は scanf スタイルの解析メソッドを使用し、失敗してもターゲット値を変更しませんでした。ただし、C 11 以降では、値変数に 0 を書き込み、抽出失敗時にフェイルビットを設定する std::strtoll が採用されています。
この変更は、istream および ostream 操作の改訂された C 11 の動作と一致しています。
結論
一方、Stroustrup の引用は、istream および ostream 操作の動作を正確に説明しています。 C 11 より前では、異なる抽出が採用されているため、C 11 以降の stringstream の動作はこの説明から逸脱します。仕組み。 C 11 以降では、stringstream 操作を使用するときにこの変更された動作を認識することが重要です。
以上がC 11 以降で抽出失敗時に「stringstream」がターゲット変数を変更するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。