Warum funktioniert stringstream >> Zielwert bei Extraktionsfehler nach C 11 ändern?
Stroustrups „TC PL“ besagt, dass der Wert einer Zielvariablen unverändert bleiben sollte, wenn ein istream- oder ostream-Vorgang fehlschlägt. Dies widerspricht jedoch dem beobachteten Verhalten mit stringstream:
#include <iostream> #include <sstream> int main() { std::stringstream ss; int v = 123; ss << "The quick brown fox."; if (ss >> v) { std::cout << "Unexpected success in reading a word into an int!\n"; } std::cout << "After extraction failure: " << v << "\n"; return 1; }
Dieser Code gibt „Nach Extraktionsfehler: 0“ aus, trotz Stroustrups Behauptung.
C 11-Verhaltensänderung
Dieser Widerspruch ergibt sich aus einer Änderung des Stringstream-Verhaltens nach C 11. Vor C 11 Stringstream verwendete eine Analysemethode im Scanf-Stil und ließ den Zielwert bei einem Fehler unverändert. Seit C 11 wird jedoch std::strtoll verwendet, das eine Null in die Wertvariable schreibt und bei einem Extraktionsfehler das Failbit setzt.
Diese Änderung stimmt mit dem überarbeiteten C 11-Verhalten von istream- und ostream-Operationen überein:
Schlussfolgerung
Während Stroustrups Zitat das Verhalten von istream- und ostream-Operationen vor C 11 genau beschreibt, weicht das Verhalten von stringstream nach C 11 ab von dieser Beschreibung abweichen, da ein anderer Extraktionsmechanismus verwendet wurde. In C 11 und höher ist es wichtig, sich dieses veränderten Verhaltens bei der Verwendung von Stringstream-Operationen bewusst zu sein.
Das obige ist der detaillierte Inhalt vonWarum ändert „stringstream' die Zielvariable bei einem Extraktionsfehler in C 11 und höher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!