I am struggling to understand why the following code does not allow an implicit conversion to occur.
#include
using namespace std;
struct HasConv
The one you want to call is a function template:
template<class charT, class Traits, class Alloc>
bool operator<(std::basic_string<charT, Traits, Alloc> const& lhs,
std::basic_string<charT, Traits, Alloc> const& rhs);
Deduction fails for the second argument because a HasConversionToString
is not a std::basic_string
- template argument deduction doesn't look through implicit conversions. As a result, that function template is removed from overload resolution.
std::experimental::basic_string_view
has a similar problem, which was solved by a "sufficient additional overloads" rule (the library must add enough overloads so that comparison between a basic_string_view
and something convertible to one works).
You don't really want such a thing for basic_string
, though - having <
possibly silently causing a trip to the heap is not really a good idea.
http://en.cppreference.com/w/cpp/language/template_argument_deduction#Implicit_conversions
Type deduction does not consider implicit conversions (other than type adjustments listed above): that's the job for overload resolution, which happens later.