Maison  >  Article  >  développement back-end  >  Pourquoi « if constexpr » ne fonctionne-t-il pas dans les fonctions non basées sur un modèle en C 17 ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-11-06 19:01:03494parcourir

Why Doesn't `if constexpr` Work in Non-Templated Functions in C  17?

if constexpr ne se comporte pas comme prévu dans les fonctions non basées sur un modèle en C 17

En C 17, l'instruction if constexpr autorise l'utilisation conditionnelle compilation basée sur des expressions constantes au moment de la compilation. Cependant, lorsque vous tentez d'utiliser cette fonctionnalité dans une fonction non basée sur un modèle, des erreurs de compilation inattendues peuvent se produire.

Considérez l'extrait de 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;
}</code>

Lors de la compilation de ce code, une erreur sera se produit sur la ligne tentant de déréférencer « valeur » dans l'instruction if constexpr. En effet, si constexpr n'est pas pris en charge dans les fonctions non basées sur des modèles.

Pourquoi uniquement les modèles ?

Ce comportement est inhérent à la conception. si constexpr est destiné à empêcher l'instanciation de code de modèle non valide basé sur des spécialisations spécifiques. Dans l'exemple fourni, la fonction non basée sur un modèle vérifie si « valeur » est un pointeur à l'aide de std::is_pointer_v. Cependant, si la condition est fausse, le compilateur tente toujours de déréférencer la « valeur » entière, qui n'est pas valide.

Solution

À utiliser if constexpr en non- Dans des contextes basés sur un modèle, envisagez d'encapsuler le code dans une fonction de modèle ou d'utiliser une macro qui se comportera différemment au moment de la compilation. Par exemple :

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

template<typename T>
void print(T value)
{
  if constexpr (std::is_pointer_v<T>)
    std::cout << "Ptr to " << *value << std::endl;
  else
    std::cout << "Ref to " << value << std::endl;
}

int main()
{
  auto n = 1000;
  print(n);

  int *ptr = &n;
  print(ptr);
}</code>

Dans ce cas, la fonction d'impression est basée sur un modèle, donc si le comportement constexpr est correctement appliqué en fonction du paramètre de modèle.

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