Maison  >  Article  >  développement back-end  >  Pourquoi ne puis-je pas utiliser un paramètre de fonction d'une fonction « constexpr » dans une expression constante ?

Pourquoi ne puis-je pas utiliser un paramètre de fonction d'une fonction « constexpr » dans une expression constante ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-14 15:06:02966parcourir

Why Can't I Use a Function Parameter of a `constexpr` Function in a Constant Expression?

Impossible d'utiliser le paramètre de fonction d'une fonction constexpr dans une expression constante

Introduction au problème et exemple de code

Le code fourni démontre une tentative de utilise la valeur de retour d'une fonction constexpr make_const dans une expression constante, mais elle rencontre un erreur.

static constexpr int make_const(const int i) {
    return i;
}

void t1(const int i) {
    constexpr int ii = make_const(i);  // Error occurs here (i is not a constant expression)
    std::cout << ii;
}

int main() {
   t1(12); // Call the function
}

Explication et approche

Une fonction constexpr, contrairement à la croyance populaire, ne fait pas comme par magie évaluer ses paramètres au moment de la compilation. Au lieu de cela, il permet la propagation de la constexprness depuis ses arguments d'entrée vers sa sortie. Cependant, dans le code donné, le paramètre de fonction i n'est pas un constexpr, donc la fonction constexpr make_const ne peut pas le convertir en un seul.

L'erreur survient parce que l'affectation ultérieure constexpr int ii = make_const(i) tente de déclarer une variable constexpr (ii) initialisée avec le résultat d'une expression non constexpr (make_const(i)). Ceci n'est pas autorisé, car les variables constexpr doivent toujours être initialisées avec des expressions constexpr.

Comprendre les fonctions constexpr

Une fonction constexpr présente deux caractéristiques clés :

  • Documentation : Elle indique au compilateur que la fonction, si elle reçoit des arguments constexpr et s'exécute sans indéfini comportement, peut être évalué au moment de la compilation.
  • Instruction : Elle invite le compilateur à évaluer la fonction au moment de la compilation si elle est utilisée dans des contextes spécifiques qui nécessitent des expressions constexpr.

Résolution

Pour résoudre l'erreur, on peut s'assurer que le paramètre de la fonction lui-même est constexpr. Ceci peut être réalisé en modifiant la déclaration de fonction en :

constexpr int make_const(constexpr int i) {
    return i;
}

Cette modification garantit que la fonction peut convertir efficacement ses entrées constexpr en sorties constexpr, permettant l'utilisation prévue de la fonction dans une expression constante.

Dans les exemples de codes alternatifs fournis, la fonction make_const peut être invoquée comme une expression constexpr dans t1 puisque ses paramètres sont désormais constexpr. Cependant, tenter de transmettre le résultat d'une expression non constexpr (telle qu'une variable d'exécution) dans la fonction entraînera toujours une erreur, car la fonction nécessite des arguments constexpr pour son exécution constexpr.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn