什么时候constexpr函数在编译时得到评估?

什么时候constexpr函数在编译时得到评估?

由于在运行时可能会调用声明为constexpr的函数,编译器在哪个条件下决定是在编译时还是在运行时计算它?

template<typename base_t, typename expo_t>constexpr base_t POW(base_t base, expo_t expo){
    return (expo != 0 )? base * POW(base, expo -1) : 1;}int main(int argc, char** argv){
    int i = 0;
    std::cin >> i;

    std::cout << POW(i, 2) << std::endl;
    return 0;}

在这种情况下,我在编译时是未知的,这可能是编译器将POW()视为在运行时调用的常规函数的原因。然而,这种动态虽然看起来很方便,但却具有一些不切实际的含义。例如,是否有一种情况我希望编译器在编译时计算constexpr函数,编译器决定将其视为普通函数,而它在编译时也会工作?有任何已知的常见陷阱吗?


慕后森
浏览 464回答 2
2回答

HUH函数

当需要常量表达式时,必须在编译时评估该函数。保证这一点的最简单方法是使用constexpr值,或std::integral_constant:constexpr&nbsp;auto&nbsp;result&nbsp;=&nbsp;POW(i,&nbsp;2);&nbsp;//&nbsp;this&nbsp;should&nbsp;not&nbsp;compile&nbsp;since&nbsp;i&nbsp;is&nbsp;not&nbsp;a&nbsp;constant&nbsp;expressionstd::cout&nbsp;<<&nbsp;result&nbsp;<<&nbsp;std::endl;要么:std::cout&nbsp;<<&nbsp;std::integral_constant<int,&nbsp;POW(i,&nbsp;2)>::value&nbsp;<<&nbsp;std::endl;要么#define&nbsp;POW_C(base,&nbsp;power)&nbsp;(std::integral_constant<decltype(POW((base),&nbsp;(power)),&nbsp;POW((base),&nbsp;(power))>::value)std::cout&nbsp;<<&nbsp;POW_C(63,&nbsp;2)&nbsp;<<&nbsp;std::endl;要么template<int&nbsp;base,&nbsp;int&nbsp;power>struct&nbsp;POW_C&nbsp;{ &nbsp;&nbsp;static&nbsp;constexpr&nbsp;int&nbsp;value&nbsp;=&nbsp;POW(base,&nbsp;power);};std::cout&nbsp;<<&nbsp;POW_C<2,&nbsp;63>::value&nbsp;<<&nbsp;std::endl;
打开App,查看更多内容
随时随地看视频慕课网APP