为什么代码会输出:bool?有什么方法可以让我const char*匹配string版本?
#include <string>
#include <iostream>
void func(bool)
{
std::cout << "bool" << std::endl;
}
void func(const std::string&)
{
std::cout << "string" << std::endl;
}
int main(int argc, char* argv[])
{
func("hello");
}
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为编译器更喜欢内置转换为用户定义的转换.从指针到a的转换bool是内置的,因此选择了重载而不是构造a std::string.
您可以添加一个重载,它将a const char*转发并转发到std::string版本:
void func(const char* arg)
{
func(std::string{arg});
}
Run Code Online (Sandbox Code Playgroud)
要回答原因:
函数匹配是编译器选择在重载集中调用哪个函数的过程.这里有两个可行的候选者(你定义的两个函数).为了选择一个,编译器对它们所暗示的转换进行排序.
第一个候选者void func(bool)意味着数组到指针的转换,然后是布尔转换(从const char[6]到const char*到bool)第二个候选意味着用户定义的转换(调用std::stringctor取a const char*)
第二次转换的排名较低,因此第一个候选人被选为最佳匹配.