Welchen Wert sollte "std :: stringstream :: fail ()" nach dem Lesen und dem Schreiben zurückgeben? (gcc vs Klang)

8

Betrachten Sie das folgende Code-Snippet:

%Vor%

clang ++ trunk gibt das folgende Ergebnis aus:

%Vor%

in der Wandbox

g ++ Trunk druckt folgendes Ergebnis:

%Vor%

auf der Wandbox

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?

    
Vittorio Romeo 22.11.2017, 15:51
quelle

1 Antwort

3

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 ().

auf      

Wenn 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 () == 0

     

bool 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.

    
songyuanyao 22.11.2017, 16:13
quelle