Warum ändert Stringstream >> den Wert des Ziels bei einem Fehler?

Aus Stroustrup's TC ++ PL, 3. Ausgabe, Abschnitt 21.3.3:

Wenn wir versuchen, eine Variable v einzulesen, und die Operation fehlschlägt, sollte der Wert von v unverändert bleiben (er bleibt unverändert, wenn v einer der Typen istream oder ostream ist, die von Mitgliedsfunktionen verarbeitet werden).

Das folgende Beispiel scheint dem obigen Zitat zu widersprechen. Basierend auf dem obigen Zitat habe ich erwartet, dass der Wert von v unverändert bleibt - aber er wird auf Null gesetzt. Was ist die Erklärung für dieses scheinbar widersprüchliche Verhalten?

#include <iostream>
#include <sstream>

int main( )
{
    std::stringstream  ss;

    ss  << "The quick brown fox.";

    int  v = 123;

    std::cout << "Before: " << v << "\n";

    if( ss >> v )
    {
        std::cout << "Strange -- was successful at reading a word into an int!\n";
    }

    std::cout << "After: " << v << "\n";

    if( ss.rdstate() & std::stringstream::eofbit  ) std::cout << "state: eofbit\n";
    if( ss.rdstate() & std::stringstream::failbit ) std::cout << "state: failbit\n";
    if( ss.rdstate() & std::stringstream::badbit  ) std::cout << "state: badbit\n";

    return 1;
}

Die Ausgabe, die ich mit x86_64-w64-mingw32-g ++ .exe (rubenvb-4.7.2-release) bekomme, ist:

Before: 123
After: 0
state: failbit

Vielen Dank.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage