C ストリームでは、障害処理の動作はストリームの種類と言語のバージョンによって異なります。この矛盾は、stringstream を使用して整数変数に単語を読み込むときに観察される予期せぬ動作によって例証されます。
伝統的に、Stroustrup の TC PL (第 3 版) で述べられているように、入力操作が失敗した場合、ターゲット変数はそのまま残される必要があります。特定のデータ型では変更されません。ただし、stringstream で型の不一致が発生すると、変数の値が変更され、引用文と矛盾します。
この矛盾の理由は、C 11 で実装された変更にあります。 C 11 より前の stringstream では、scanf スタイルの解析を使用して数値を抽出しました。 C 11 では、このメソッドは、失敗時にターゲットを変更する std::strtoll などの呼び出し関数に置き換えられました。
その結果、解析戦略の変更により、異なる失敗動作が導入されました。 C 11 より前では、ターゲットは変更されませんでしたが、C 11 以降では、失敗時にターゲットはゼロに設定されます。
この理論を検証するには、次のような参考資料を参照してください。回答で提供されたもの。このリファレンスでは、C 11 より前は、抽出に失敗すると値が変更されず、フェイルビットが設定されることが説明されています。ただし、C 11 以降では、失敗するとターゲットの値が 0 になり、フェイルビットが設定されます。
さらに、リファレンスには、入力演算子が do_get 関数を利用する num_get locale ファセットに依存すると記載されています。 。 C 11 では、do_get が std::strtoll および同様の関数を使用するように変更されており、その結果、観察される動作の変化が生じています。
以上がC Stringstream の障害処理が C 11 の前後で異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。