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