Maison >développement back-end >C++ >Pourquoi « if constexpr » ne fonctionne-t-il pas comme prévu dans les fonctions C non basées sur un modèle ?

Pourquoi « if constexpr » ne fonctionne-t-il pas comme prévu dans les fonctions C non basées sur un modèle ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-06 10:54:02568parcourir

Why Doesn't `if constexpr` Work as Expected in Non-Templated C   Functions?

if constexpr en C 17 ne fonctionne pas dans les fonctions non basées sur un modèle

Introduction

Le La norme C 17 a introduit la construction if constexpr, qui permet une exécution conditionnelle basée sur des expressions constantes. Cependant, il a été observé que si le comportement de constexpr diffère lorsqu'il est utilisé dans des fonctions basées sur un modèle ou non.

Problème

Considérez la fonction non basée sur un modèle suivante :

<code class="cpp">void print()
{
  auto value = 100;
  if constexpr (std::is_pointer_v<decltype(value)>){
    std::cout << "Ptr to " << *value << std::endl; // Error
  }
  else {
    std::cout << "Ref to " << value << std::endl;
  }
}</code>

Ce code entraîne une erreur de compilation car *value n'est pas valide pour le type déduit int.

Réponse

Ce comportement est voulu par la conception. Dans les fonctions basées sur un modèle, if constexpr peut éviter d'instancier des branches qui ne sont pas valides pour des spécialisations de modèles spécifiques. Cependant, dans les fonctions non basées sur un modèle, if constexpr ne supprime pas la compilation de la branche non prise.

Les deux branches de l'instruction if constexpr sont analysées et analysées, même si la branche non prise n'est pas valide. Par conséquent, dans le code ci-dessus, le compilateur tentera d'évaluer *value pour un type int, ce qui entraînera une erreur.

Conclusion

Cette distinction est importante à comprendre lors de l'utilisation de if constexpr. Dans les fonctions non basées sur un modèle, il ne doit être utilisé que pour vérifier des expressions constantes dont la validité est garantie pour toutes les valeurs possibles des paramètres d'entrée.

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