There’s one case we haven’t covered so far: pointers to C-style character strings and string literals. Now that we have a version of debug_rep
that takes a string
, we might expect that a call that passes character strings would match that version. However, consider this call:
cout << debug_rep("hi world!") << endl; // calls debug_rep(T*)
Here all three of the debug_rep
functions are viable:
• debug_rep(const T&)
, with T
bound to char[10]
• debug_rep(T*)
, with T
bound to const char
• debug_rep(const string&)
, which requires a conversion from const char*
to string
Both templates provide an exact match to the argument—the second template requires a (permissible) conversion from array to pointer, and that conversion is considered as an exact match for function-matching purposes (§ 6.6.1, p. 245). The nontemplate version is viable but requires a user-defined conversion. That function is less good than an exact match, leaving the two templates as the possible functions to call. As before, the T*
version is more specialized and is the one that will be selected.
If we want to handle character pointers as string
s, we can define two more nontemplate overloads:
// convert the character pointers to string and call the string version of debug_rep
string debug_rep(char *p)
{
return debug_rep(string(p));
}
string debug_rep(const char *p)
{
return debug_rep(string(p));
}