我想e
在编译时计算值(别担心,不是功课),但是出了点问题。
template<size_t limit = 3, class result = std::ratio<0, 1>, size_t factorial = 1, size_t count = 1>
constexpr double e_impl() {
if constexpr(limit == 0) {
return static_cast<double>(result{}.num) / result{}.den;
}
return e_impl<limit - 1, std::ratio_add<result, std::ratio<1, factorial>>, factorial * count, count + 1>();
}
虽然计算的值是正确的,但编译器会抛出关于模板溢出的错误。看起来limit
变量超出了范围(下图0
),但它不应该发生,因为语句0
正在处理 –case if constexpr(…)
。
所以问题是,我错了,这种行为应该是预期的,还是编译器错误?使用 GCC 7.1.0 编译。