sstream

___ tag123languagelawyer ___ Für Fragen zu den Feinheiten formeller oder autoritativer Spezifikationen von Programmiersprachen und Umgebungen. ___ qstnhdr ___ Welchen Wert sollte "std :: stringstream :: fail ()" nach dem Lesen und dem Schreiben zurückgeben? (gcc vs Klang) ___ tag123iostream ___ Die C ++ iostream-Bibliothek ist eine objektorientierte Bibliothek, die über Streams Ein- und Ausgabefunktionen bereitstellt. Die Iostreams-Klassen unterstützen typsichere I / O-Typen und können zur Unterstützung benutzerdefinierter Typen durch Überladen der Operatoren >> und << erweitert werden. ___ qstntxt ___

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 %code% zwischen den beiden Compilern unterschiedlich. Was sagt der Standard zum Verhalten von %code% in diesem Fall? Ist es für die Implementierung so definiert, dass %code% / %code% beim Schreiben in einen Stream gesetzt wird, der bereits verbraucht wurde?

    
___ tag123stream ___ hilf uns dieses Wiki zu bearbeiten ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer47439311 ___

Gcc ist korrekt. %code% erbt von %code% und entsprechend dem Verhalten von %code% (wird von %code% 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.

%code% wurde in diesem Fall gesetzt, dann gibt %code% ungleich Null zurück und bewirkt, dass das Schreiben fehlgeschlagen ist (wie das Ergebnis gezeigt hat), dann sollte %code% gesetzt werden.

    
___
1
Antwort

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

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....
22.11.2017, 15:51