Quand un constexpr fonction évaluée au moment de la compilation?

Car il est possible qu'une fonction déclarée comme constexpr peut être appelé au cours de l'exécution, en vertu de laquelle les critères retenus par le compilateur décider de le calculer au moment de la compilation ou au cours de 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, je n'est pas connu au moment de la compilation, ce qui est probablement la raison pour laquelle le compilateur traite POW() comme une fonction qui est appelée lors de l'exécution. Cette dynamique cependant, comme pratique, comme cela peut apparaître à, a quelques pas pratique implications. Par exemple, pourrait-il y avoir un cas où je voudrais le compilateur pour calculer une constexpr fonction lors de la compilation, le compilateur décide de la traiter comme une fonction normale au lieu de cela, quand il aurait travaillé au cours de la compilation-temps ainsi? Sont-ils connus et les pièges les plus courants?

  • Autant que je sache, lorsque tous les arguments sont des expressions constantes.
  • Et si j'écris POW((unsigned __int64)2, 63). Serait-ce encore le comte comme une expression constante?
  • En fait, c'est plus complexe que ça je pense. Je pense que constexpr ne doit être évaluée lorsque son résultat est utilisé comme un paramètre du modèle, tableau lié, ou d'autres partie intégrante de la constante. Tout autre temps est une optimisation. En fait, même quand l'expression constante arguments, il peut être nécessaire d'exécuter au moment de l'exécution. constexpr int func(int p) { return !p ? 1 : throw std::exception("HI");} doit être évalué au moment de l'exécution lorsque la non-zéro.
  • Les initialiseurs qui sont des expressions constantes font partie de la statique de la phase d'initialisation, par exemple constexpr int a = POW(5, 4);. C'est essentiellement calculée au moment de la compilation. Mais bien sûr, vous pouvez toujours utiliser POW dans d'autres endroits.
  • À moins que le résultat de la fonction est utilisée dans votre susmentionnés constante de l'expression "requirerers", alors il va donner une erreur de compilation à cause de l'exception.
  • J'ai couru hors de l'espace de commentaire, mais oui 😀
  • connexes: stackoverflow.com/questions/14294271/...

InformationsquelleAutor Byzantian | 2013-01-09