4

以下是该主题的主题:

#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变体?

4

2 回答 2

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

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

于 2013-05-01T14:18:54.917 回答
6

那是因为"hello"有类型const char[6],它会衰减到const char*,而后者又可以bool通过另一种标准转换方式转换成。因此,整体转换:

const char[6] -> bool

只需通过标准转换即可执行。

另一方面,将 a 转换const char*为 anstd::string需要用户定义的转换(调用 的转换构造函数std::string),并且在进行重载解析时,标准转换优于用户定义的转换。

于 2013-05-01T14:18:58.850 回答