"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-26
Parcourir:417

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

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

Dans C 17, l'introduction de "if constexpr" a suscité l'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 :

#include 
#include 

void print(auto value)
{
  // Compile-time check if value is a pointer
  if constexpr (std::is_pointer_v)
    std::cout 

Bien que ce code se compile sans erreur dans les fonctions basées sur un modèle, il échoue avec une 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 basée sur un modèle, 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 fournissez des informations de type explicites à la fonction non basée sur un modèle pour garantir la déduction du type au moment de la compilation.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3