Heim >Backend-Entwicklung >C++ >Warum unterscheidet sich die Fehlerbehandlung von C Stringstream vor und nach C 11?
In C-Streams unterscheidet sich das Verhalten der Fehlerbehandlung je nach Stream-Typ und Sprachversion. Diese Diskrepanz wird durch das unerwartete Verhalten veranschaulicht, das beim Einlesen eines Worts in eine Ganzzahlvariable mithilfe von Stringstream beobachtet wird.
Traditionell, wie in Stroustrups TC PL (3. Auflage) angegeben, sollte die Zielvariable bestehen bleiben, wenn eine Eingabeoperation fehlschlägt bei bestimmten Datentypen unverändert. Wenn jedoch eine Typinkongruenz im Stringstream auftritt, wird der Wert der Variablen geändert, was im Widerspruch zum zitierten Zitat steht.
Der Grund für diese Diskrepanz liegt in der in C 11 implementierten Änderung. Vor C 11 verwendete Stringstream eine Analyse im Scanf-Stil, um Zahlen zu extrahieren. In C 11 wurde diese Methode durch Aufruffunktionen wie std::strtoll ersetzt, die das Ziel im Falle eines Fehlers ändern.
Die Änderung der Parsing-Strategie führte folglich zu einem anderen Fehlerverhalten. Vor C 11 blieb das Ziel unverändert, während in C 11 und später das Ziel bei einem Fehler auf Null gesetzt wird.
Um diese Theorie zu überprüfen, konsultieren Sie eine Referenz wie z die in der Antwort angegebene. In dieser Referenz wird erläutert, dass vor C 11 ein Fehler bei der Extraktion dazu führte, dass der Wert unverändert blieb und das Failbit gesetzt wurde. Ab C 11 führt ein Fehler jedoch dazu, dass für das Ziel ein Nullwert und das Failbit gesetzt wird.
Darüber hinaus heißt es in der Referenz, dass der Eingabeoperator auf der Lokalisierungsfacette num_get basiert, die die Funktion do_get nutzt . In C 11 wurde do_get geändert, um std::strtoll und ähnliche Funktionen zu verwenden, was zu der beobachteten Verhaltensänderung führte.
Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich die Fehlerbehandlung von C Stringstream vor und nach C 11?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!