2016-04-04 17 views
2

Ich habe es schwer zu verstehen.Warum ist es erlaubt, eine Ausnahme innerhalb einer noexcept-Tag-Funktion zu werfen?

dies kompiliert gut in clang (ich habe gcc nicht überprüft), aber es scheint mir Unsinn. Warum sollte ein Compiler zulassen, dass eine noexcept-Funktion eine throw-Anweisung enthält?

+0

Versuchen Sie es .......... –

+0

['std :: terminate'] (http://cdn.theatlantic.com/assets/media/img/mt.2014/2012/term/lead_large .jpg) – user657267

+0

Sorry, der Titel ist irreführend. Die eigentliche Frage ist natürlich "Warum sollte ein Compiler zulassen, dass eine noexcept-Funktion eine throw-Anweisung enthält?". – tunnuz

Antwort

2

Was passiert, wird std::terminate() ausgelöst wird, da Ihre Ausnahme-Spezifikation dies nicht zulassen (siehe [except.spec/9]).

Warum es erlaubt ist, ist es nicht möglich, erschöpfend zu prüfen, ob etwas gegen die Spezifikation verstößt. Betrachten Sie etwas wie:

double f(double); 
double compute(double x, double y) noexcept 
{ 
    return x/f(y); 
} 

Kann f werfen? Kann ich nicht sagen.

2

Es ist möglich, dass eine Funktion, die nicht wirft, tatsächlich geworfen wird.
Wenn eine noexcept Funktion tut werfen, wird terminate aufgerufen, wodurch die Verheißung, nicht zur Laufzeit zu werfen.

// The compiler does not check the `noexcept` specification at compile time. 
void f() noexcept // Promises to not throw any exception 
{ 
    throw runtime_error("error"); // Violates the exception specification 
} 

angeben, dass eine Funktion verspricht die Anrufer nicht der Nicht-Wurf Funktion werfen, dass sie nie mit Ausnahmen befassen müssen.

Entweder wirft die Funktion nicht oder das gesamte Programm wird beendet.

Verwandte Themen