C++函数重载优先级

C++ function overload priority

本文关键字:优先级 重载 函数 C++      更新时间:2023-10-16

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

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

您可以添加一个重载,该重载需要const char*并将其转发到std::string版本:

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

要回答原因:

函数

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

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

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

根据标准 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(。

因此,由于bool char const *是标准隐式转换,而隐式转换为std::string因此,用户定义的转换是更好的转换,并且在过载分辨率方面是首选。

要强制重载解析选择std::string版本:

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