Why the overload resolution for the call max(x, y)
in the expression return max(max(x, y), z);
below results in a call to the non-template function char const* max(char const*, char const*)
?
When invoking this function:
template <typename T>
T const& max (T const& x, T const& y, T const& z)
{
return max (max(x, y), z);
}
T
is deduced to be const char*
. Therefore, this signature is instantiated:
const char* const& max (
const char* const& x,
const char* const& y,
const char* const& z
)
The function internally calls the binary version of max()
with arguments of type const char*
. Both the template and the non-template overload are viable for an argument of type const char*
.
However, when two functions are viable for resolving the call and one of them is not a template, the non-template version is considered a best fit.
Per Paragraph 13.3.3/1 of the C++11 Standard:
Given these definitions,** a viable function F1 is defined to be a better function than another viable function
F2 if** for all arguments i, ICSi(F1) is not a worse conversion sequence than ICSi(F2), and then
— for some argument j, ICSj(F1) is a better conversion sequence than ICSj(F2), or, if not that,
— the context is an initialization by user-defined conversion (see 8.5, 13.3.1.5, and 13.3.1.6) and the
standard conversion sequence from the return type of F1 to the destination type (i.e., the type of the
entity being initialized) is a better conversion sequence than the standard conversion sequence from
the return type of F2 to the destination type. [ ... ] or, if not that,
— F1 is a non-template function and F2 is a function template specialization, or, if not that,
— F1 and F2 are function template specializations, and the function template for F1 is more specialized
than the template for F2 according to the partial ordering rules described in 14.5.6.2.
This explains why the non-template overload is picked.