Betrachten Sie das folgende Code-Snippet:
%Vor%clang ++ trunk gibt das folgende Ergebnis aus:
%Vor%
g ++ Trunk druckt folgendes Ergebnis:
%Vor%
Wie Sie sehen, ist der Wert von ss.fail()
zwischen den beiden Compilern unterschiedlich. Was sagt der Standard zum Verhalten von std::stringstream
in diesem Fall? Ist es für die Implementierung so definiert, dass failbit
/ badbit
beim Schreiben in einen Stream gesetzt wird, der bereits verbraucht wurde?
Gcc ist korrekt. std::stringstream
erbt von std::basic_ostream
und entsprechend dem Verhalten von operator<<(std::basic_ostream)
(wird von ss << "foo";
aufgerufen),
Effekte: Benimmt sich wie ein formatierter Inserter (wie in [ostream.formatted.reqmts] beschrieben) von out.
Und von §30.7.5.2.1 / 1 Allgemeine Anforderungen [ostream.formatted.reqmts] :
(Betonung meiner)
Jede formatierte Ausgabefunktion beginnt mit der Ausführung, indem ein Objekt der Klassenwache erstellt wird. Wenn dieses Objekt true zurückgibt, wenn es in einen Wert vom Typ bool konvertiert wird, versucht die Funktion, die angeforderte Ausgabe zu generieren. Wenn die Generierung fehlschlägt, setzt die formatierte Ausgabefunktion den Status (ios_base :: failbit) , wodurch möglicherweise eine Ausnahme ausgelöst wird.
Und §30.7.5.1.3 Klasse basic_ostream :: sentry [ostream :: sentry] :
Wenn os.good () ungleich Null ist, bereitet es auf formatierte oder unformatierte Ausgaben vor. Wenn os.tie () kein Nullzeiger ist, ruft os.tie () - & gt; flush ().
aufWenn nach Abschluss einer Vorbereitung os.good () wahr ist, ok_ == wahr sonst, ok_ == false. Während der Vorbereitung kann der Konstruktor Aufruf von setstate (failbit) (was ios_base :: failure auslösen kann) ([iostate.flags]))
Und §30.5.5.4 basic_ios kennzeichnet Funktionen [iostate.flags] :
iostate rdstate () const;
Rückgabe: Der Fehlerstatus des Stream-Puffers.bool gut () const;
Gibt Folgendes zurück: rdstate () == 0bool eof () const;
Gibt zurück: true, wenn eofbit in rdstate () gesetzt ist.
eofbit
wurde in diesem Fall gesetzt, dann gibt std::basic_ios::good
ungleich Null zurück und bewirkt, dass das Schreiben fehlgeschlagen ist (wie das Ergebnis gezeigt hat), dann sollte failbit
gesetzt werden.
Tags und Links c++ iostream language-lawyer sstream