Why does the compiler prefer f(const void*) to f(const std::string &)?

Converting to a std::string requires a "user defined conversion".

Converting to void const* does not.

User defined conversions are ordered behind built in ones.