Puisqu'il est possible qu'une fonction déclarée comme constexpr puisse être appelée pendant l'exécution, selon quels critères le compilateur décide-t-il de la calculer à la compilation ou pendant l'exécution ?
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;
}
Dans ce cas, i est inconnu au moment de la compilation, ce qui est probablement la raison pour laquelle le compilateur traite POW() comme une fonction régulière qui est appelée au moment de l'exécution. Cependant, cette dynamique, aussi pratique qu'elle puisse paraître, a quelques implications peu pratiques. Par exemple, pourrait-il y avoir un cas où je voudrais que le compilateur calcule une fonction constexpr pendant la compilation, où le compilateur décide de la traiter comme une fonction normale à la place, alors que cela aurait également fonctionné pendant la compilation ? Existe-t-il des pièges courants connus ?