在计算用于初始化constexpr
的常量表达式时,有可能会抛出异常。例如,下面是一个例子,其中计算常量表达式被防止溢出:
当计算用于初始化constexpr
的常量表达式时,有可能会抛出异常。例如,在这里可以看到对常量表达式的计算受到了溢出的保护:
#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";
}
}
第一次调用f()
只是展示了一个constexpr
可以被计算。第二次调用f()
没有用于初始化一个constexpr
并抛出一个运行时异常。第三次调用f()
用于初始化constexpr
,但是由于抛出了异常,这一点永远不会到达。然而,在这种情况下应该发生什么?我希望在catch
子句中执行处理程序,但是gcc和clang都会产生编译时错误。
constexpr
的情况下从三元运算符中抛出异常的问题(https://dev59.com/kWEi5IYBdhLWcg3w6PvZ)。然而,当异常被抛出和捕获时,我没有预料到会导致编译时错误:毕竟,`constexpr`的初始化永远不会被执行... - Dietmar Kühltest.cpp:17:23: error: constexpr variable 'f42' must be initialized by a constant expression
相当明显...? - Joachim Isaksson