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

Pourquoi « if constexpr » provoque-t-il des erreurs dans les fonctions non basées sur un modèle en C 17 ?

Barbara Streisand
Libérer: 2024-11-06 03:58:02
original
768 Les gens l'ont consulté

Why does

Erreur "If constexpr" dans les fonctions non modélisées en C 17

Introduction

C 17 a introduit le if constexpr mot-clé, permettant une compilation conditionnelle basée sur des constantes de compilation. Cependant, des erreurs inattendues peuvent survenir lors de l'utilisation de if constexpr dans des fonctions non basées sur un modèle. Cet article explore ces problèmes et propose une solution.

Exemple de code

Considérez le code suivant :

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

int main() {
  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;
}
Copier après la connexion

Erreur de compilation

Ce code génère une erreur de compilation lorsque l'instruction if constexpr est dans la fonction principale :

main.cpp:8:32: error: invalid type argument of unary ‘*’ (have ‘int’)
std::cout << "Ptr to " << *value << std::endl;
Copier après la connexion

Explication

If constexpr uniquement fonctionne dans les fonctions de modèle car il permet au compilateur d'éviter d'instancier des branches qui ne sont pas prises au moment de la compilation. Cette optimisation est essentielle pour une métaprogrammation de modèle efficace.

Dans les fonctions non-modèles, if constexpr évalue toujours les deux branches, même si le type est déduit par decltype. Cela signifie que l'erreur dans le code ci-dessus est provoquée par la tentative de déréférencement d'une valeur int dans la branche if.

Solution

Pour résoudre ce problème, vous pouvez déplacez l'instruction if constexpr dans une fonction de modèle. Par exemple :

<code class="cpp">template <typename T>
void print(T value) {
  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() {
  auto value = 100;
  print(value);
}</code>
Copier après la connexion

Ce code modifié compilera et imprimera le résultat attendu :

Ref to 100
Copier après la connexion

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!