Search code examples
c++stlc++17implicit-conversionoverload-resolution

std::string implicit conversion priority, string_view over const char*


I have two overloaded functions:

void Set(const char * str) { std::cout << "const char * setter: " << str << "\n"; }
void Set(const std::string_view & sv) { std::cout << "string_view setter: " << sv << "\n"; }

And I call Set() on a std::string. It picks the std::string_view overload rather than the const char * overload, i.e. it chooses the implicit conversion of std::string to std::string_view over std::string to const char *.

Is this a guaranteed behaviour in std::string, or was their choice arbitrary? If it is a guaranteed behaviour, how did they make it prefer the string_view conversion over the other?


Solution

  • std::string has a non-explicit conversion operator to std::string_view, so it could convert to std::string_view implicitly. But std::string doesn't have a conversion operator to const char*, it can't convert to const char*. You have to call its c_str() method explicitly to get a const char*:

    Set(some_string.c_str());