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

时间:2013-05-01 14:16:41

标签: 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;
}

该计划的输出为bool。选择bool变体的原因是什么?

2 个答案:

答案 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}}的转换构造函数),并且标准转换更可取在进行重载解析时,用户定义的转换