什么重载的C++函数会被调用?

4 c++ overloading

以下是该主题的主题:

#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)是比用户定义的转换序列或省略号转换序列更好的转换序列,并且
  • [...]

标准转换序列仅涉及标准转换.用户定义的转换序列是涉及单个用户定义的转换的序列.


And*_*owl 6

这是因为"hello"const char[6]衰减的类型,而这种类型const char*又可以bool通过另一种标准转换转换成.因此,整体转换:

const char[6] -> bool
Run Code Online (Sandbox Code Playgroud)

可以通过标准转换执行.

在另一方面,转换const char*std::string将需要一个用户定义的转换(调用的转换构造std::string),和标准转换超过用户定义的转换优选在做重载解析时.

  • 为什么人们一直坚持通过`void*`转换为`bool`?*任何*指针都可以直接转换为`bool`**(4.12*算术的prvalue,unscoped枚举,指针或成员类型的指针可以转换为bool类型的prvalue.零值,空指针值,或null成员指针值转换为false;任何其他值转换为true.*) (2认同)