Co się stanie, gdy zgłoszony zostanie wyjątek podczas obliczania constexpr?

Podczas obliczania wyrażeń stałych do inicjalizacji aconstexpr możliwe jest rzucanie wyjątków. Na przykład tutaj jest przykład, w którym obliczanie stałego wyrażenia jest chronione przed przepełnieniem:

#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";
    }
}

Pierwsze połączenie dof() po prostu pokazuje, że aconstexpr można obliczyć. Drugie połączenie dof() nie jest używany do inicjalizacji aconstexpr i zgłasza wyjątek czasu wykonywania. Trzecie połączenie dof() służy do inicjalizacji aconstexpr ale ten punkt nigdy nie dotrze, ponieważ wyrzucany jest wyjątek. Co jednak powinno się w tym przypadku stać? Spodziewałbym się, że przewodnik będzie wcatch-klauz jest wykonywany, ale obagcc iszczęk wygenerować błąd czasu kompilacji.

questionAnswers(1)

yourAnswerToTheQuestion