Considérez les 2 surcharges suivantes
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
Le 1er fonctionne pour les classes régulières, tandis que le 2ème fonctionne pour les modèles qui ne sont pas instanciés. Par exemple:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
Considérez maintenant la fonction de modèle suivante:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
Dans GCC, il donne une erreur pour la résolution de surcharge ambiguë, tandis que Clang compile. Fait intéressant, le deuxième appel à test () ne produit pas d'erreurs (même dans GCC). De plus, si je retire la template<typename U>
chose au-dessus de templfun, gcc cesse de se plaindre.
Est-ce un bug avec GCC ou est-ce du code illégal?