Maison > développement back-end > C++ > le corps du texte

Pourquoi ne puis-je pas utiliser « if constexpr » dans les fonctions non basées sur un modèle en C 17 ?

Susan Sarandon
Libérer: 2024-11-06 04:13:02
original
488 Les gens l'ont consulté

Why Can't I Use `if constexpr` in Non-Templated Functions in C  17?

"if constexpr" de C 17 limité aux fonctions de modèle

En C 17, l'introduction de "if constexpr" a suscité un intérêt pour son capacité à exécuter du code de manière conditionnelle en fonction des constantes de compilation. Cependant, un problème survient lorsque vous tentez de l'utiliser dans des fonctions non basées sur un modèle.

Considérez le code suivant :

<code class="cpp">#include <iostream>
#include <type_traits>

void print(auto value)
{
  // Compile-time check if value is a pointer
  if constexpr (std::is_pointer_v<decltype(value)>)
    std::cout << "Ptr to " << *value << std::endl;
  else
    std::cout << "Ref to " << value << std::endl;
}

int main()
{
  // Error when printing a non-pointer
  print(100);
}</code>
Copier après la connexion

Bien que ce code se compile sans erreur dans les fonctions basées sur un modèle, il échoue avec un erreur de compilation lorsqu'il est placé dans une fonction non basée sur un modèle comme print. La raison réside dans le comportement de "if constexpr."

"if constexpr" est conçu pour permettre la compilation conditionnelle du code du modèle. Dans une fonction modèle, le compilateur déduit le type du paramètre au moment de la compilation, permettant ainsi la sélection du chemin de code approprié en fonction du type. Dans ce cas, lorsque la fonction d'impression est modélisée, elle peut identifier si la valeur est un pointeur au moment de la compilation et exécuter la branche de code correspondante.

Cependant, dans une fonction non basée sur un modèle, le type de valeur est connu uniquement au moment de l'exécution, ce qui rend "if constexpr" inefficace. Le compilateur traite les deux branches du conditionnel comme du code exécutable, ce qui entraîne une erreur de compilation lors de la tentative de déréférencement de la valeur dans la branche Ptr lorsque la valeur est un entier.

Pour éviter ce problème, il est nécessaire de placer " if constexpr" dans une fonction modèle ou fournir des informations de type explicites à la fonction non-modèle pour garantir la déduction de type au moment de la compilation.

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!