Spécialisation partielle sur le paramètre de modèle non typé du type incorrect

Considérer ce qui suit:

template  struct uint_ { }; template  struct X { static constexpr bool value = false; }; template  // NB: int, not unsigned struct X<uint_> { static constexpr bool value = true; }; int main() { static_assert(X<uint_>::value, "!"); } 

Clang comstack le code, pas gcc.

Cependant, dans l’exemple suivant hautement lié:

 template  struct uint_ { }; template  // NB: int, not unsigned void foo(uint_ ) { } int main() { foo(uint_{} ); } 

les deux compilateurs rejettent sans appel de fonction correspondante à foo . Le comportement de gcc est cohérent, pas celui de clang, donc l’un des compilateurs a un bogue pour l’un des exemples. Quel compilateur est correct?

GCC est correct. [temp.deduct.type] / 17 :

Si P a une forme contenant , et si le type de la valeur correspondante de A diffère du type de i , la déduction échoue.