Maison >développement back-end >C++ >Pourquoi « if constexpr » provoque-t-il des erreurs dans les fonctions non basées sur un modèle en C 17 ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-11-06 03:58:02866parcourir

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;
}

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;

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>

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

Ref to 100

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