A function template specialization determines the effect of a call when the template itself is selected by overload resolution (which uses the signature, but not the definition, of the specialization). This is true whether the specialization is implicitly or explicitly generated.
A separate function participates in overload resolution on its own, competing with the function template at a slight advantage that can easily be offset by template argument deduction (though not here, since your T
cannot be deduced). It can be excluded entirely by using an explicit template argument list (even an empty one if all template arguments can be deduced), which means the template should still be given a sensible definition for all types (even if some are deleted or otherwise do not compile).
As for inline
, the concerns are no different from those for any function: providing the definition in the header can be important for optimization, allow a header-only library, reduce textual repetition, …or merely produce tighter coupling that makes the code harder to change. Since the definition of the primary template must usually be in the header, there is perhaps a bias toward putting the definition of the specialization there as well. As always, knowledge of the application and judgment is required.