由于在运行时可能会调用声明为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;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我在编译时是未知的,这可能是编译器将POW()视为在运行时调用的常规函数的原因.然而,这种动态虽然看起来很方便,但却具有一些不切实际的含义.例如,是否有一种情况我希望编译器在编译时计算constexpr函数,编译器决定将其视为普通函数,而它在编译时也会工作?有任何已知的常见陷阱吗?
我不能在函数中使用constexpr值,而不是函数外部.
我可以auto ar1 = std::array<int, il.size()>();在il定义的范围内使用.
但我不能使用{ return std::array<T, il.size()>();}in constexpr-functionil_to_array()
为什么我不能在函数中使用constexpr值,但我可以在此值的块范围内执行相同的操作?
#include <iostream>
#include <initializer_list>
#include <array>
constexpr size_t size_to_size(size_t v) { return v; } // 1 - OK
template<typename T>
constexpr size_t il_to_size(std::initializer_list<T> il) { return il.size(); } // 2 - OK
// 3 - error
template<typename T>
constexpr auto il_to_array(std::initializer_list<T> il) {return std::array<T, il.size()>();}
template<size_t N>
void print_constexpr() { std::cout << N << std::endl; }
int main() { …Run Code Online (Sandbox Code Playgroud)