Wenn Sie Exceptions ausschalten, indem Sie mit -fno-exceptions
kompilieren, werden alle Funktionen berücksichtigt, die nicht zum Beispiel durch std::move_if_noexcept
berücksichtigt werden, oder müssen Sie trotzdem Funktionen deklarieren?Sind alle Funktionen "noexcept", wenn Ausnahmen deaktiviert sind?
Antwort
Die -fno-exceptions
verhindert das Auslösen von Ausnahmen, aber es kann nicht verhindern, dass Ausnahmen aus Bibliotheken ausgelöst werden.
Zum Beispiel wird als nächstes Beispiel beendet wegen nicht abgefangene Ausnahme:
#include <vector>
int main()
{
std::vector<int> v{1,2,3,4,5,6};
return v.at(55);
}
Aber nächstes Beispiel wird nicht kompiliert, da die -fno-exceptions
Option:
int main()
{
throw 22;
}
Es scheitert mit:
g++ -std=c++11 -g -Wall -Wextra -fno-exceptions ./garbage.cpp
./garbage.cpp: In function ‘int main()’:
./garbage.cpp:4:8: error: exception handling disabled, use -fexceptions to enable
throw 22;
Von this article, Doing without chapter:
Benutzercode, der C++ Schlüsselwörter wie throw verwendet, versuchen, und fangen produzieren Fehler selbst wenn der Benutzer Code enthalten libstdC++ Header und Konstrukte wie basic_iostream verwenden.
Auf der anderen Seite, noexcept
markiert das Verfahren als ein Verfahren, das keine Ausnahmen werfen ist. Jede ausgelöste Ausnahme ruft std::terminate
auf (siehe [except.terminate]/2 im C++ - Standard).
Nächstes Beispiel:
struct A
{
void foo() noexcept
{
throw 33;
}
};
int main()
{
A a;
try
{
a.foo();
}
catch(...)
{
}
}
endet mit:
terminate called after throwing an instance of 'int'
Aborted (core dumped)
Zum Schluss: das Verhalten ist ganz anders, wenn Sie -fno-exceptions
verwenden und wenn Sie die Funktion als noexcept
markieren.
Obwohl ich mein ganzes Projekt mit -fno-Ausnahmen (aus anderen Gründen) kompilieren muss ich noch bewegen Konstrukteuren einen Umzug assigment Betreiber noexcept erklären, damit für std :: move_if_noexcept semantische bewegen?
Wenn Sie diese Option verwenden, werden die Funktionen nicht automatisch als noexcept markiert. Sie müssen es manuell tun. Der Compiler darf solche Änderungen nicht vornehmen.
Wenn eine solche Änderung zulässig wäre, würde this example verschiedene Ausgaben erzeugen.
Ich weiß, dass das Verhalten ganz anders ist. Meine Frage ist: Obwohl ich mein ganzes Projekt mit '-fno-exceptions' kompiliere (aus anderen Gründen), muss ich Move Constructors trotzdem eine move assigment operators deklarieren, um move semantic für std :: move_if_noexcept zu aktivieren. – TNA
@TNA Ok, also habe ich den Punkt missverstanden. Hoffentlich editiert es korrigiert –
- 1. Sind alle .NET-Ausnahmen serialisierbar?
- 2. phpMyAdmin - Fehler: relationale Funktionen sind deaktiviert
- 3. Behinderte Ausnahmen und noexcept()
- 4. Inline Ckeditor: Alle Tasten sind deaktiviert
- 5. Wo sind alle einfachen Funktionen in WebGL?
- 6. Sind der Kopierkonstruktor und die Kopierzuordnung von std :: runtime_error noexcept?
- 7. web.xml - mehrere Ausnahmen sind nicht
- 8. Klasse Objekte unregelmäßig sind, wenn Funktionen zuweisen
- 9. Warum .NET-Ausnahmen veränderbar sind?
- 10. Was sind die abgeleiteten Ausnahmen?
- 11. Sind alle nicht abgefangenen Ausnahmen in PHP fatal?
- 12. Sind anonyme Funktionen erlaubt?
- 13. Wie Sie überprüfen, ob alle Kontrollkästchen deaktiviert sind
- 14. jQuery-Selektor für alle aktivierten Checkboxen, die nicht deaktiviert sind
- 15. Schaltfläche deaktiviert, während erforderliche Felder leer sind
- 16. Android Listview, wenn Artikel Fokussierbare sind, deaktiviert Klicks
- 17. Warum sind Linkbuttons nicht ausgegraut, wenn sie in FireFox deaktiviert sind?
- 18. Spalte ausblenden, wenn alle Zeilen leer sind
- 19. Ereignis, wenn alle MDI-Formulare geschlossen sind
- 20. Alert Benutzer, wenn alle Karten gepaart sind
- 21. Cursorposition holen, wenn alle Anwendungsformulare unscharf sind
- 22. Verhindern, dass Kontrollkästchen aktiviert/deaktiviert sind
- 23. An welchem Punkt sind Ausnahmen ausgelöst, wenn Django ORM
- 24. locationServicesEnabled Test wird bestanden, wenn sie in viewDidLoad deaktiviert sind
- 25. iOS - Verwendung von @import, wenn Module deaktiviert sind Fehler
- 26. iPod Mini-Steuerelemente deaktiviert, wenn bestimmte Audio-Sitzungsparameter eingestellt sind
- 27. Wie funktionieren PHP-Sitzungen, wenn Cookies deaktiviert sind?
- 28. CSS transparenten Hintergrund Fallback, wenn Bilder deaktiviert sind
- 29. Wie authentifiziere ich Benutzer, wenn Cookies deaktiviert sind?
- 30. ASP.NET Deaktivieren Schaltfläche "Senden" nur, wenn alle Steuerelemente validiert sind
Viele Funktionen [möglicherweise noch Ausnahmen] (http://stackoverflow.com/questions/6049563/with-fno-exceptions-what-happens-with-new-t) trotz der Kompilierung mit '-Fno-Exceptions' – Praetorian
http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_exceptions.html sagt nicht viel darüber, ich bin mir nicht sicher, ob das die definitive Referenz ist. –
Jemand hat [gefragt] (http://comments.gmane.org/gmane.comp.compilers.clang.devel/30992) ziemlich genau die gleiche Frage auf der Clam-Mailing-Liste, und die Antwort lautet: * Das Kompilieren mit '-fno-exceptions' ist nicht das Gleiche wie das Spezifizieren von' noexcept' für alle Funktionen *. – Praetorian