#1 Le 18/08/2015, à 14:41
- louis94
constexpr en C++, comparaison d'un pointeur avec nullptr
Bonjour,
Je voudrais écrire (en C++) le code suivant:
constexpr bool x = (("string" + 1) == nullptr);
constexpr bool y = ("string" == nullptr);
Clang (3.6.2) l'accepte sans problème ni avertissement ; GCC (5.2.0) prétend que x n'est pas initialisé par une expression constante (alors qu'il veut bien de y). Ma question est donc : qui a raison ? Cette page me semble donner raison à Clang, sauf si nullptr_t est défini comme void* (encore que, la conversion est ici implicite, pas de cast). De toute manière, std::is_same me dit que les deux sont différents.
Louis
PS: Je veux évaluer x pour pouvoir faire quelque chose de ce genre :
constexpr bool isalnum(char c); // Pas en conflit avec isalnum de libc parce que dans un namespace
constexpr bool isalnum(const char *str)
{
return str != nullptr && (*str == 0 || (isalnum(*str) && isalnum(str + 1)));
}
constexpr bool isidentifier(const char *str)
{
return str != nullptr && *str == '$' && isalnum(str + 1); // isalnum(str + 1) n'est pas constant pour GCC
}
constexpr bool vrai = isidentifier("$var");
Je vais de toute façon modifier mon code pour que ça compile.
Hors ligne