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, "");
}
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().
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)
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_*).
× 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.
Discord NaN. Mon site.