Maison >développement back-end >C++ >Pourquoi `stringstream >>` met-il à zéro la variable cible en cas d'échec de l'extraction dans C 11 et versions ultérieures ?

Pourquoi `stringstream >>` met-il à zéro la variable cible en cas d'échec de l'extraction dans C 11 et versions ultérieures ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-01 06:16:12633parcourir

Why Does `stringstream >>` Mettre à zéro la variable cible en cas d'échec d'extraction dans C 11 et versions ultérieures ?
` Mettre à zéro la variable cible en cas d'échec de l'extraction dans C 11 et versions ultérieures ? " />

Pourquoi stringstream >> modifie-t-il la valeur de la cible en cas d'échec ?

Dans le passage cité du "TC PL, 3e édition" de Stroustrup, l'auteur déclare que la valeur de v devrait rester inchangé si l'opération d'extraction échoue. Cependant, un exemple contredit cette affirmation, car v est mis à zéro lorsque l'opération stringstream >> échoue.

Explication du comportement contradictoire

La clé pour comprendre cette apparente contradiction réside dans le comportement différent de l'opérateur d'extraction >> 🎜>

Avant C 11

Avant C 11, >> utilisait un mécanisme d'analyse de style scanf. Lorsque l'extraction échouait, il laissait la valeur de v inchangée et définissait l'indicateur failbit.

Depuis C 11

Avec C 11, >> est passé à l'utilisation de la facette std::num_get pour analyser l'entrée conformément à la mise à jour. spécification, si l'extraction échoue :

    Pour les types de base comme int, 0 est écrit dans v et l'indicateur failbit est défini.
  • Pour les types avec protection contre les débordements, tels que std :: numeric_limits::max() ou std::numeric_limits::min() est écrit dans v et l'indicateur failbit est set.

Exemple d'explication de sortie

Dans l'exemple fourni :

    La valeur de v est initialement 123.
  • Après avoir tenté de lire un mot dans v (qui échoue), la valeur de v est définie sur 0.
  • Le rdstate() du stringstream indique que le failbit est défini, confirmant l'échec de l'extraction.
Ce comportement est cohérent avec le comportement mis à jour de >> introduit en C 11.

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