In C 11 dieser ++ ist veraltet: Warum verursacht die "dynamische Ausnahme" -Garantie einen Overhead?
void foo() noexcept;
In this article von
void foo() throw();
und ersetzt wird erklärt, dass der Grund für diese (unter anderem, dass einkochen auf die gleiche Sache) ist das
C++ - Ausnahmespezifikationen werden zur Laufzeit und nicht zur Kompilierzeit überprüft, so dass sie kein Programmierer garantieren, dass alle Ausnahmen behandelt wurden.
Während dieser Sinn für mich macht, ich verstehe nicht, warum throw()
dynamisch an erster Stelle geprüft wurde, oder warum noexcept
keine Ausnahme Garantie ausgenommen bieten std::terminate
anstelle der normalen Stapel Aufruf Abwickeln (was nicht der Fall ist wirklich eine solide Garantie IMO).
Wäre es nicht möglich zu überprüfen, ob während der Kompilierzeit Exceptions ausgelöst werden oder nicht und die Kompilierung fehlschlägt, wenn dies geschieht? Wie ich es sehe, gibt es grundsätzlich drei Fälle:
void foo() noexcept
{
// 1. Trivial case
throw myexcept();
// 2. Try-catch case
// Necessary to check whether myexcept is derived
// from exception
try
{
throw myexcept();
}
catch(exception const & e)
{}
// 3. Nested function call
// Recursion necessary
bar();
}
Mit Vorlagen in C++ für jede Art instanziiert wird, sowieso Anwendungen dauert ewig Kompilieren - warum also nicht noexcept
ändern, den Compiler zu zwingen, zu prüfen, ob Ausnahmen geworfen werden während Zeit kompilieren?
Die einzige Schwierigkeit, die ich sehe, ist, dass eine Funktion je nach Laufzeitzuständen werfen kann oder nicht - aber diese Funktion sollte sich meiner Meinung nach noexcept
sowieso nicht nennen dürfen.
Fehle ich etwas oder war es die Absicht, die Kompilierungszeit nicht weiter zu erhöhen, oder die Compiler-Entwickler zu beschneiden?
Es gibt keine Möglichkeit für den Compiler zu wissen, ob beispielsweise eine Bibliotheksfunktion, die Sie innerhalb Ihrer Funktion aufrufen, eine Ausnahme auslöst. – lapk
'throw()' ist eine Garantie für den Compiler. 'noexcept' ist eine Garantie für den Compiler. –
@PetrBudnik: Natürlich gibt es jede Funktion, die nicht als "noexcept" markiert ist. –