Incohérence de GCC avec la norme pour la spécialisation explicite dans une portée non-espace de noms
La norme C permet explicitement de déclarer des spécialisations de modèles explicites dans n'importe quelle portée où le modèle principal correspondant peut être défini. Cependant, le comportement de GCC s'écarte de cette norme. Cette différence a été observée dans les versions récentes de GCC, où les spécialisations explicites déclarées en dehors d'un espace de noms ne parviennent pas à se compiler.
Pour illustrer le problème, considérons le code suivant :
template<typename T> struct Widget { template<typename U> void foo(U) { } template<> void foo(int*) { } };
Alors que cela le code se compile avec succès dans Clang, il rencontre une erreur dans GCC :
error: explicit specialization in non-namespace scope 'struct Widget<T>'
Cette erreur est incompatible avec le standard C, qui autorise explicitement une spécialisation explicite dans une portée non-espace de noms. Selon le paragraphe 2 de [temp.expl.spec] dans la norme C :
"Une spécialisation explicite peut être déclarée dans n'importe quelle portée dans laquelle le modèle principal correspondant peut être défini."
Cet écart par rapport à la norme constitue un bug potentiel dans GCC. Pour signaler ce problème, suivez ces étapes :
En signalant ce problème, vous pouvez contribuer à l'amélioration de GCC et vous assurer qu'il adhère pleinement à la norme C.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!