Dlaczego stringstream >> zmienia wartość celu w przypadku awarii?

Z Stroustrup's TC ++ PL, 3rd Edition, Section 21.3.3:

Jeśli spróbujemy wczytać zmienną v i operacja się nie powiedzie, wartość v powinna pozostać niezmieniona (jest niezmieniona, jeśli v jest jednym z typów obsługiwanych przez funkcje członkowskie istream lub ostream).

Poniższy przykład wydaje się przeczyć powyższemu cytatowi. Na podstawie powyższego cytatu oczekiwałem, że wartość v pozostanie niezmieniona - ale zostanie wyzerowana. Jakie jest wyjaśnienie tego pozornego sprzecznego zachowania?

#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;
}

Dane wyjściowe otrzymane przy użyciu x86_64-w64-mingw32-g ++. Exe (rubenvb-4.7.2-release) 4.7.2 to:

Before: 123
After: 0
state: failbit

Dzięki.

questionAnswers(2)

yourAnswerToTheQuestion