Maison  >  Article  >  développement back-end  >  Pourquoi `stringstream` modifie-t-il la variable cible en cas d'échec de l'extraction dans C 11 et versions ultérieures ?

Pourquoi `stringstream` modifie-t-il la variable cible en cas d'échec de l'extraction dans C 11 et versions ultérieures ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-26 15:46:09470parcourir

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

Pourquoi stringstream >> Modifier la valeur cible en cas d'échec de l'extraction après C 11 ?

Le "TC PL" de Stroustrup indique que la valeur d'une variable cible doit rester inchangée si une opération istream ou ostream échoue. Cependant, cela contredit le comportement observé avec 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;
}

Ce code affiche "Après l'échec de l'extraction : 0", malgré l'affirmation de Stroustrup.

C 11 Modification du comportement

Cette contradiction provient d'un changement dans le comportement de stringstream après C 11. Avant C 11, stringstream utilisait un méthode d'analyse de style scanf, laissant la valeur cible inchangée en cas d'échec. Cependant, depuis C 11, il utilise std::strtoll, qui écrit un zéro dans la variable de valeur et définit le bit d'échec en cas d'échec de l'extraction.

Ce changement s'aligne sur le comportement révisé C 11 des opérations istream et ostream :

  • En cas d'échec, la valeur cible est définie sur 0 ou sur la valeur extrême appropriée.
  • failbit est défini pour indiquer l'échec.

Conclusion

Bien que la citation de Stroustrup décrit avec précision le comportement des opérations istream et ostream avant C 11, le comportement de stringstream après C 11 s'écarte de cette description est due à l'adoption d'un mécanisme d'extraction différent. En C 11 et au-delà, il est essentiel d'être conscient de ce comportement modifié lors de l'utilisation d'opérations stringstream.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn