std :: make_shared mit werfen dtor und libc ++ kompiliert nicht

9

Hier ist ein sehr einfacher Code:

%Vor%

Kompiliert wie folgt:

%Vor%

Beim Kompilieren mit libc ++ kommt es zu folgendem Fehler:

%Vor%

Ich dachte, es könnte ein Fehler in libc ++ sein, aber ich wollte hier nachschauen, bevor ich einen Fehler einreiche.

    
Innocent Bystander 04.05.2017, 19:23
quelle

1 Antwort

3
___ 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 völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123g ___ g ++ ist das C ++ - Frontend für die GNU Compiler Collection (gcc). ___ tag123clang ___ clang ist ein C-, C ++ - und Objective-C-Compiler, der Vorverarbeitung, Parsing, Optimierung,        Codegenerierung, Assemblierung und Verknüpfung. Abhängig davon, welche High-Level-Moduseinstellung bestanden wird, Clang        wird angehalten, bevor eine vollständige Verbindung hergestellt wird. Während Clang hoch integriert ist, ist es wichtig zu verstehen        die Phasen der Kompilation, um zu verstehen, wie man sie aufruft. ___ tag123libc ___ libc ++ ist eine offene C ++ - Standardbibliothek und ein Unterprojekt von LLVM.org. Es wurde für C ++ 11 entwickelt. ___ tag123c11 ___ C ++ 11 ist eine 2011 verabschiedete Version des C ++ - Sprachstandards. Sie hat viele Änderungen und Ergänzungen der Kernsprache sowie der verbesserten und erweiterten C ++ - Standardbibliothek vorgenommen. ___ qstntxt ___

Hier ist ein sehr einfacher Code:

%Vor%

Kompiliert wie folgt:

%Vor%

Beim Kompilieren mit libc ++ kommt es zu folgendem Fehler:

%Vor%

Ich dachte, es könnte ein Fehler in libc ++ sein, aber ich wollte hier nachschauen, bevor ich einen Fehler einreiche.

    
___ antwort43907314 ___

die Frage (n) kochen auf:

  • Sollte das kompilieren? A: Vielleicht
  • Was passiert, wenn Sie es ausführen? A: Sie erhalten undefiniertes Verhalten.

AS @ T.C. sagt, [res.on.functions] / 2 states:

  

In bestimmten Fällen (Ersatzfunktionen, Handlerfunktionen, Operationen für Typen, die zum Standardisieren von Standardbibliotheksvorlagenkomponenten verwendet werden) hängt die C ++ - Standardbibliothek von Komponenten ab, die von einem C ++ - Programm bereitgestellt werden. Wenn diese Komponenten nicht ihren Anforderungen entsprechen, enthält diese Internationale Norm keine Anforderungen an die Implementierung.

     

Insbesondere sind die Effekte in den folgenden Fällen undefiniert:

     

[überspringen]

     

- wenn eine Ersatzfunktion oder eine Handlerfunktion oder ein Destruktorvorgang über eine Ausnahme beendet wird, sofern dies nicht ausdrücklich im entsprechenden Erforderlichen Verhalten: Absatz erlaubt ist.

Standard-seise beiseite, das Werfen von einem Destruktor war eine schlechte Idee für eine lange, lange Zeit (mindestens seit C ++ 98). Wenn es eine Ausnahme im Flug gibt und Sie während des Abwickelns des Stapels eine weitere Ausnahme auslösen, ist das eine schnelle Reise nach std::terminate() .

    
___ qstnhdr ___ std :: make_shared mit werfen dtor und libc ++ kompiliert nicht ___
Marshall Clow 11.05.2017, 05:35
quelle

Tags und Links