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
Libérer: 2024-12-01 06:16:12
original
746 Les gens l'ont consulté

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