Maison >développement back-end >C++ >Pourquoi la gestion des échecs de C Stringstream diffère-t-elle avant et après C 11 ?

Pourquoi la gestion des échecs de C Stringstream diffère-t-elle avant et après C 11 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-25 02:23:29150parcourir

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

Impact de la gestion des échecs sur la valeur cible avec stringstream

Dans les flux C, le comportement de la gestion des échecs diffère selon le type de flux et la version du langage. Cet écart est illustré par le comportement inattendu observé lors de la lecture d'un mot dans une variable entière à l'aide de stringstream.

Traditionnellement, comme indiqué dans le TC PL de Stroustrup (3e édition), si une opération d'entrée échoue, la variable cible doit rester inchangé dans certains types de données. Cependant, lorsqu'on rencontre une incompatibilité de type dans stringstream, la valeur de la variable est modifiée, contredisant la citation citée.

Modification C 11

La raison de cet écart réside dans le changement implémenté dans C 11. Avant C 11, stringstream utilisait une analyse de style scanf pour extraire les nombres. En C 11, cette méthode a été remplacée par des fonctions d'appel telles que std::strtoll, qui modifient la cible en cas d'échec.

Par conséquent, le changement de stratégie d'analyse a introduit un comportement d'échec différent. Avant C 11, la cible restait inchangée, tandis qu'en C 11 et plus tard, la cible est mise à zéro en cas d'échec.

Vérification et analyse

Pour vérifier cette théorie, consultez une référence telle que celui fourni dans la réponse. Cette référence explique qu'avant C 11, l'échec de l'extraction laissait la valeur inchangée et définissait le bit d'échec. Cependant, dans C 11 et au-delà, l'échec entraîne la définition d'une valeur nulle pour la cible et le bit d'échec.

De plus, la référence indique que l'opérateur d'entrée s'appuie sur la facette locale num_get, qui utilise la fonction do_get. . En C 11, do_get a été modifié pour utiliser std::strtoll et des fonctions similaires, provoquant ainsi le changement de comportement observé.

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