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.