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 :
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!