既然可能会在运行时调用声明为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;
}
在这种情况下,编译时i是未知的,这可能是编译器将POW()视为在运行时调用的常规函数的原因。然而,这种动态性看起来很方便,但却具有一些不切实际的影响。例如,是否存在这样的情况,我希望编译器在编译时计算constexpr函数,但编译器决定将其视为普通函数,即使它也可以在编译时工作?有没有已知的常见陷阱?
constexpr
只有在其结果被用作模板参数、数组边界或其他整型常量时才需要求值。任何其他时间都是一种优化。事实上,即使给定常量表达式参数,它也可能需要在运行时执行。当给定非零输入时,constexpr int func(int p) { return !p ? 1 : throw std::exception("HI");}
必须在运行时求值。 - Mooing Duck