Was passiert, wenn beim Berechnen eines Constexpr eine Ausnahme ausgelöst wird?
Beim Berechnen konstanter Ausdrücke zum Initialisieren von aconstexpr
es ist möglich ausnahmen zu werfen. Beispiel: Hier ist ein Beispiel, in dem die Berechnung eines konstanten Ausdrucks vor Überlauf geschützt ist:
#include <iostream>
#include <stdexcept>
constexpr int g(int n, int n0, int n1) {
return n == 0? n1: g(n - 1, n1, n0 + n1);
}
constexpr int f(int n) {
return n < 42? g(n, 0, 1): throw std::out_of_range("too big");
}
int main()
{
try {
constexpr int f41 = f(41); // OK: constexpr
int f43 = f(43); // OK: throws an exception
constexpr int f42 = f(42); // not OK but what happens?
}
catch (std::exception const& ex) {
std::cout << "ERROR: " << ex.what() << "\n";
}
}
Der erste Anruf beif()
zeigt nur, dass aconstexpr
berechnet werden kann. Der zweite Anruf nachf()
wird nicht zum Initialisieren von a verwendetconstexpr
und löst eine Laufzeitausnahme aus. Der dritte Aufruf anf()
wird verwendet, um a zu initialisierenconstexpr
Dieser Punkt wird jedoch nie erreicht, da eine Ausnahme ausgelöst wird. Was soll aber in diesem Fall passieren? Ich würde den Handler in der erwartencatch
-Klausel wird aber beide ausgeführtgcc undklapperte einen Fehler bei der Kompilierung erzeugen.