Peter, it seems to the parameter is declared as if it likes Test<T,T>, change the argument of the function call to Test<int,char>{}, The three compiler all report the deduced T is conflicting , T = int vsĀ  T= char. So, I wonder the compiler process Test<T> as Test<T, T>, according to the outcome report.