以下是该主题的主题:
#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;
}
Run Code Online (Sandbox Code Playgroud)
该程序的输出是bool.为什么bool选择变体?
Jos*_*eld 14
要调用bool过载,需要进行以下转换:
const char[6] ---> const char* ---> bool
Run Code Online (Sandbox Code Playgroud)
要调用std::string过载,需要进行以下转换:
const char[6] ---> const char* ---> std::string
Run Code Online (Sandbox Code Playgroud)
这涉及用户定义的转换(使用转换构造函数std::string).没有用户定义转换的任何转换序列优先于具有用户定义转换的序列.
比较隐式转换序列的基本形式(如13.3.3.1中所定义):
- 标准转换序列(13.3.3.1.1)是比用户定义的转换序列或省略号转换序列更好的转换序列,并且
- [...]
标准转换序列仅涉及标准转换.用户定义的转换序列是涉及单个用户定义的转换的序列.
这是因为"hello"有const char[6]衰减的类型,而这种类型const char*又可以bool通过另一种标准转换转换成.因此,整体转换:
const char[6] -> bool
Run Code Online (Sandbox Code Playgroud)
可以通过标准转换执行.
在另一方面,转换const char*到std::string将需要一个用户定义的转换(调用的转换构造std::string),和标准转换超过用户定义的转换优选在做重载解析时.