为什么编译器更喜欢f(const void *)而不是f(const std :: string&)?

考虑以下代码:

#include <iostream>
#include <string>

// void f(const char *) { std::cout << "const char *"; } // <-- comment on purpose
void f(const std::string &) { std::cout << "const std::string &"; }
void f(const void *) { std::cout << "const void *"; }

int main()
{
    f("hello");
    std::cout << std::endl;
}

我使用f(const void*)编译了该程序:

$ g++ -std=c++11 strings_1.cpp -Wall
$ ./a.out

const void *

请注意,注释是有意测试的,否则编译器将使用f(const void*)

那么,为什么编译器会选择f(const void*)而不是f(const std::string &)

1个解决方案
54 votes

转换为void const*需要“用户定义的转换”。

不能转换为void const*

用户定义的转换在内置转换之后进行排序。

Yakk - Adam Nevraumont answered 2020-06-29T22:44:58Z
translate from https://stackoverflow.com:/questions/53354226/why-does-the-compiler-prefer-fconst-void-to-fconst-stdstring