Diskrepanz zwischen dem istream-Operator (double & val) zwischen libc ++ und libstdc ++

8

Mit meinem letzten Upgrade auf Mac OS X 10.9 wurde die Standard-C ++ - Standardbibliothek von libstdc ++ in libc ++ geändert. Seitdem beobachte ich unerwartetes Verhalten des Stringstream-Operators & gt; & gt; (doppelt), der im folgenden Codebeispiel dokumentiert ist.

Zusammenfassend scheint die libc ++ Probleme beim Extrahieren von Doppelwerten aus Stringstreams zu haben, wenn auf den Doppelwert ein Buchstabe folgt.

Ich habe bereits den Standard (2003) überprüft, aber ich kann keine spezifischen Informationen finden, wenn die Extraktion in diesem Fall funktionieren sollte oder nicht.

Ich wäre also dankbar für jede Eingabe, ob das ein Fehler in libc ++ oder libstdc ++ ist.

%Vor%

Kompilieren des Codes mit c++ --stdlib=libc++ streamtest.cxx ergibt

%Vor%

Kompilieren des Codes mit c++ --stdlib=libstdc++ streamtest.cxx ergibt

%Vor%

Compiler-Version ist

%Vor%     
Stephan Aiche 01.11.2013, 10:36
quelle

1 Antwort

2

Sieht so aus, dass libstdc ++ richtig ist und libc ++ nach 22.4.2.1.2 des (2011) Standards falsch ist.

In Stufe 2

  

Wenn [das Zeichen - nm] nicht verworfen wird, wird geprüft, ob c als nächstes Zeichen eines Eingabefeldes des von Stufe 1 zurückgegebenen Konvertierungsspezifizierers zulässig ist ["% g" in diesem Fall - nm]. Wenn ja, ist es angesammelt.

Da %g conversion specifier d oder X Zeichen nicht zulässt, wird das Zeichen nicht akkumuliert. Es wird auch nicht verworfen (nur Gruppentrennzeichen können verworfen werden). Deshalb muss Stufe 2 an diesem Punkt enden.

Dann werden in Stufe 3 akkumulierte Zeichen umgewandelt.

Es sieht so aus, als würde libc ++ in Stufe 2 fälschlicherweise d und X akkumulieren und dann versuchen, sie zu konvertieren, und das scheitert.

    
n.m. 01.11.2013 13:42
quelle