C ++函数重载优先级

时间:2015-06-23 07:53:32

标签: 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");
}

3 个答案:

答案 0 :(得分:9)

这是因为编译器更喜欢内置转换为用户定义的转换。从指针到bool的转换是内置的,因此选择了重载而不是构造std::string

您可以添加一个带const char*的重载并将其转发到std::string版本:

void func(const char* arg)
{
    func(std::string{arg});
}

答案 1 :(得分:6)

回答原因:

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

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

第二次转化的排名较低,因此第一位候选人被选为最佳匹配。

答案 2 :(得分:1)

根据标准N4431 §13.3.3.2/ 2排名隐式转换序列[over.ics.rank] (强调我的)

  

比较隐式转化序列的基本形式(如   在13.3.3.1)(2.1)中定义 - 标准转换序列   (13.3.3.1.1)是比用户定义更好的转换序列   转换序列或省略号转换序列,以及(2.2) - a   用户定义的转换序列(13.3.3.1.2)是一种更好的转换   序列比省略号转换序列(13.3.3.1.3)。

因此,因为char const *bool是标准的隐式转换,与隐式转换为std::string相比,用户定义的转换是更好的转换,在过载时更受欢迎分辨率。

为了强制重载决策选择std::string版本:

func(std::string("hello"));