std::string 隐式转换优先级,string_view 高于 const char*

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

我有两个重载函数:

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"; }

然后我在 std::string 上调用 Set()。它选择 std::string_view 重载而不是 const char * 重载,即它选择 std::stringstd::string_view 的隐式转换而不是 std::stringconst char *.

这是 std::string 中的一种有保证的行为,还是他们的选择是任意的?如果这是一种有保证的行为,他们是如何让它更喜欢 string_view 转换而不是其他转换的?

std::string 有一个 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() 方法明确地得到一个 const char*:

Set(some_string.c_str());