Voici quelque chose que j'ai observé à travers différents compilateurs. Il semble qu'il y ait des bogues de compilateur.Pourquoi la gestion d'expression de paramètre de modèle non-type est-elle incohérente entre les compilateurs?
template <int I>
struct X
{ };
int main(void)
{
X<(16 > 1)> a; // Works on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<(int(16) > 1)> b; // Works on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<(16 >> 1)> c; // Works on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<(int(16) >> 1)> d; // Fails on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<16 > 1> e; // Fails on vc9, works on g++ 4.1.2, fails on Comeau 4.3.10.1
X<int(16) > 1> f; // Fails on vc9, fails on g++ 4.1.2, fails on Comeau 4.3.10.1
X<16 >> 1> g; // Fails on vc9, works on g++ 4.1.2, fails on Comeau 4.3.10.1
X<int(16) >> 1> h; // Fails on vc9, works on g++ 4.1.2, fails on Comeau 4.3.10.1
}
Pourquoi cette incohérence? Qu'est-ce qui est autorisé/refusé par la norme? Un tel comportement est également responsable de l'erreur de syntaxe lors de l'utilisation de BOOST_AUTO sur vc9. Il me semble que Comeau fait le bon travail en rejetant toutes les expressions sans parenthèses.
Je ne pense pas que cela n'a rien à voir avec le modèle étant non type, mais plutôt parce qu'il utilise le caractère '>' à l'intérieur du modèle. – Marcin
Vous avez raison Marcin, j'ai vu ce comportement incohérent avec les opérateurs '>' et '>>' surchargés de classes définies par l'utilisateur. – Sumant
Parce que ce serait une construction rarement utilisée et donc moins susceptible d'être testé. Et vous seriez fâché de les utiliser en code réel de toute façon. Mais cela vaut la peine de les soumettre comme tests au fabricant du compilateur afin qu'ils puissent l'ajouter à leur suite de tests de choses folles que les gens font. –