以下是该主题的主题:
#include <string>
#include <iostream>
void test(bool val)
{
std::cout << "bool" << std::endl;
}
void test(std::string val)
{
std::cout << "std::string" << std::endl;
}
int main(int argc, char *argv[])
{
test("hello");
return 0;
}
该计划的输出为bool
。选择bool
变体的原因是什么?
答案 0 :(得分:14)
要调用bool
重载,需要进行以下转换:
const char[6] ---> const char* ---> bool
要调用std::string
重载,需要进行以下转换:
const char[6] ---> const char* ---> std::string
这涉及用户定义的转换(使用std::string
的转换构造函数)。任何没有用户定义转换的转换序列都优先于具有用户定义转换的序列。
比较隐式转换序列的基本形式(如13.3.3.1中所定义):
- 标准转换序列(13.3.3.1.1)是比用户定义的转换序列或省略号转换序列更好的转换序列,
- [...]
标准转换序列仅涉及标准转换。用户定义的转换序列涉及单个用户定义的转换。
答案 1 :(得分:6)
这是因为"hello"
的类型为const char[6]
,它会衰减到const char*
,而bool
又可以通过另一个标准转换转换为const char[6] -> bool
< / em>的。因此,整体转换:
const char*
只需通过标准转换即执行。
另一方面,将std::string
转换为std::string
需要用户定义的转换(调用{{1}}的转换构造函数),并且标准转换更可取在进行重载解析时,用户定义的转换。