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.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage