Considera i 2 sovraccarichi seguenti
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
Il primo funziona per le classi regolari, mentre il secondo per i modelli non istanziati. Per esempio:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
Ora considera la seguente funzione modello:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
In GCC dà un errore per la risoluzione ambigua del sovraccarico, mentre Clang compila. È interessante notare che la seconda chiamata a test () non produce errori (anche in GCC). Inoltre, se rimuovo la template<typename U>
cosa sopra templfun, gcc smette di lamentarsi.
È un bug con GCC o è un codice illegale?