Maison > développement back-end > C++ > 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
Libérer: 2024-11-26 15:46:09
original
524 Les gens l'ont consulté

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal