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
Libérer: 2024-11-06 10:54:02
original
566 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal