C 11 以降で抽出失敗時に「stringstream」がターゲット変数を変更するのはなぜですか?

Barbara Streisand
リリース: 2024-11-26 15:46:09
オリジナル
472 人が閲覧しました

Why Does `stringstream` Modify the Target Variable on Extraction Failure in C  11 and Later?

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 の動作と一致しています。

  • 失敗した場合、目標値は 0 または適切な極端値に設定されます
  • failbit は失敗を示すために設定されます。

結論

一方、Stroustrup の引用は、istream および ostream 操作の動作を正確に説明しています。 C 11 より前では、異なる抽出が採用されているため、C 11 以降の stringstream の動作はこの説明から逸脱します。仕組み。 C 11 以降では、stringstream 操作を使用するときにこの変更された動作を認識することが重要です。

以上がC 11 以降で抽出失敗時に「stringstream」がターゲット変数を変更するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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