When you use template function with real argument, compiler will extract
type information form real argument, then generate real function code for
you. So it will make compiler looks longer.
Why we need a overload template function, Because not all type support the
same operator. For example, in your template function, you use = operator,
but when you use array for this template function type, compiler will report
error.
Overload is different with Specializations, Overload means that you have
different function signatures. Specialization have the same function
signature.
"Why Not Specialize Function Templates?" You can see it in the
ref.
"Why Argument Dependent Lookup doesn’t work with function template
dynamic_pointer_cast". See it in the ref
"C++ template function taking template class as parameter" See in
ref.