C++函数重载优先级

jay*_*ubi 3 c++ overloading

为什么代码会输出: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)

Tar*_*ama 9

发生这种情况是因为编译器更喜欢内置转换为用户定义的转换.从指针到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)


Ad *_*d N 6

要回答原因:

函数匹配是编译器选择在重载集中调用哪个函数的过程.这里有两个可行的候选者(你定义的两个函数).为了选择一个,编译器对它们所暗示的转换进行排序.

第一个候选者void func(bool)意味着数组到指针的转换,然后是布尔转换(从const char[6]const char*bool)第二个候选意味着用户定义的转换(调用std::stringctor取a const char*)

第二次转换的排名较低,因此第一个候选人被选为最佳匹配.