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.