ホームページ > バックエンド開発 > C++ > C Stringstream の障害処理が C 11 の前後で異なるのはなぜですか?

C Stringstream の障害処理が C 11 の前後で異なるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-25 02:23:29
オリジナル
196 人が閲覧しました

Why Does C   Stringstream's Failure Handling Differ Before and After C  11?

stringstream によるターゲット値に対する障害処理の影響

C ストリームでは、障害処理の動作はストリームの種類と言語のバージョンによって異なります。この矛盾は、stringstream を使用して整数変数に単語を読み込むときに観察される予期せぬ動作によって例証されます。

伝統的に、Stroustrup の TC PL (第 3 版) で述べられているように、入力操作が失敗した場合、ターゲット変数はそのまま残される必要があります。特定のデータ型では変更されません。ただし、stringstream で型の不一致が発生すると、変数の値が変更され、引用文と矛盾します。

C 11 の変更

この矛盾の理由は、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート