Так как возможно, что во время выполнения может быть вызвана функция, объявленная как 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 во время компиляции, когда компилятор решает рассматривать его как нормальную функцию, а также, когда он работал бы во время компиляции? Существуют ли какие-либо известные ошибки?