When two or more different declarations are specified for a single name
in the same scope, that name is said to be
overloaded,
and the declarations
are called
overloaded declarations.
Only function and function template
declarations can be overloaded; variable and type declarations
cannot be overloaded.
When a function name is used in a call, which function
declaration is being referenced and the validity of the call
are determined by comparing the types
of the arguments at the point of use with the types of the parameters
in the declarations that are visible at the point of use.