Глядя на следующий код, меня смущает строка 3.
Строка 3 не является частным случаем базового шаблона, она больше похожа на «перегрузку класса».Но он может быть успешно скомпилирован.
Объект obj1 в строке 7 определен в соответствии со строкой 3, но не скомпилирован.
Почему?
template<typename S,int T, void(* U)()> class Bar{}; // Base template
template<int T, void(* U)()> class Bar<double, T, U>{}; // Specialization, which is good
template<int T, void(* U)()> class Bar<double, U, T>{}; // Also good, how come?
void func(){};
int main(){
//Bar<double, func, 1> obj1; // Error, from line 3
}