Maison >développement back-end >C++ >Pourquoi ne puis-je pas utiliser « if constexpr » dans les fonctions non basées sur un modèle en C 17 ?

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

Susan Sarandon
Susan Sarandonoriginal
2024-11-06 04:13:02556parcourir

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>

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!

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