c – 可能的模板和constexpr – 如果不兼容

前端之家收集整理的这篇文章主要介绍了c – 可能的模板和constexpr – 如果不兼容前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在编译时计算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>();
}

虽然计算值是正确的,但编译器会抛出有关模板溢出的错误.似乎限制变量超出范围(低于0),但它不应该发生,因为0-case由if constexpr(…)语句处理.

所以问题是,我错了,应该预期这种行为,还是编译错误?用GCC 7.1.0编译.

解决方法

要避免错误,请将第二个返回显式放入else分支:
template<size_t limit = 3,size_t count = 1>
constexpr double e_impl() {
    if constexpr(limit == 0) {
        return static_cast<double>(result{}.num) / result{}.den;
    }
    else
    {
      return e_impl<limit - 1,count + 1>();
    }
}

https://godbolt.org/g/PdV7m7

合理的:

During an instantiation of the enclosing function template or generic lambda,if the converted condition is true and the statement includes a constexpr else substatement,that substatement is not instantiated.

http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0128r1.html

它没有说明一个无约束的else块,或一个不应该运行的块,因此它被实例化,抛出错误. (注意:铿锵声也失败了)

猜你在找的C&C++相关文章