Partage
  • Partager sur Facebook
  • Partager sur Twitter

std::isdigit dans une fonction constexpr ?

    5 janvier 2024 à 16:00:18

    Hello ! :)

    Je me suis aperçu qu'il est possible d'appeler la fonction std::isdigit depuis une fonction constexpr, alors que la fonction isdigit ne semble pas être constexpr. Et je ne parviens pas à comprendre pourquoi.

    #include <cctype>
    
    constexpr bool foo(char c)
    {
        return std::isdigit(c);
    }
    
    int main()
    {
        constexpr auto res = foo('0');
        static_assert(res, "");
    }

    Merci pour vos lumières. :)

    • Partager sur Facebook
    • Partager sur Twitter
      5 janvier 2024 à 16:42:26

      Bonjour,

      C'est, en effet, curieux. std::isdigit() dépend théoriquement de la locale et donc je ne vois pas comment elle pourrait être constexpr. Semble être une méga optimisation qui "sait" que '0' est bien toujours un chiffre!!

      J'ai essayé sur compilateur MSVC, il refuse la fonction foo().

      -
      Edité par Dalfab 5 janvier 2024 à 16:46:50

      • Partager sur Facebook
      • Partager sur Twitter
        5 janvier 2024 à 18:27:40

        J'ai testé sur godbolt, MSVC et Clang rejettent ce code, mais pas GCC. D'après la norme, isdigit n'est pas constexpr, donc ça ne devrait pas passer. C'est peut etre du compiler-specific a GCC. Il faudrait voir l'implémentation (mais j'ai pas un GCC sous la main pour le moment)
        • Partager sur Facebook
        • Partager sur Twitter
          5 janvier 2024 à 23:10:43

          C'est spécifique à gcc qui a tendance à remplacer pas mal de code par une constante (qui dépendent ou non des locales). Mais comme dans les en-têtes tout est marqué extern, je suppose que c'est une optimisation en dure dans gcc. Il y a plusieurs fonctions de la libc concernées par ce problème (probablement la plupart des équivalents __builtin_*).

          • Partager sur Facebook
          • Partager sur Twitter

          std::isdigit dans une fonction constexpr ?

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown