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::string
到 std::string_view
的隐式转换而不是 std::string
到 const 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());
我有两个重载函数:
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::string
到 std::string_view
的隐式转换而不是 std::string
到 const 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());