Parenthèse qui perturbe un calcul d'expression constante
EDIT: oubliez, j'ai trouvé mon erreur.
Bonjour,
Voulant adapter un Bit Twiddling Hack en fonction constexpr, je suis tombé sur quelque chose qui me perturbe assez.
Code:
1 2 3
| static_assert(8|(8>>1)|(8>>2)|(8>>4)|(8>>8) == 15, "succes normal");
static_assert((8|(8>>1)|(8>>2)|(8>>4)|(8>>8)) == 14, "succes anormal");
static_assert(1+(8|(8>>1)|(8>>2)|(8>>4)|(8>>8)) == 16, "WTF?"); |
Avec GCC 4.6.3 et clang 3.5, le premier calcul me donne le bon résultat. Le second, avec la parenthèse en plus, me fait perdre 1 au résultat, et du coup, le dernier foire totalement.
Est-ce moi qui ne suit pas réveillé, ou assistons-nous à un bug de 2 compilos ?
EDIT: c'est la même chose avec les divers compilos (VC++, clang, icc, gcc) que j'ai pu essayer en ligne. Au détail qu'ils me trouvent un soucis de précédence dans les priorités de | sur la seconde ligne. Cela n'explique pas le dernier résultat, même sur-parenthésé, qui vaut tout le temps 15.