c++ - 为什么编译器更喜欢 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;
}
我使用以下方法编译了这个程序g++ (Ubuntu 6.5.0-1ubuntu1~16.04) 6.5.0 20181026
:
$ g++ -std=c++11 strings_1.cpp -Wall
$ ./a.out
const void *
请注意,该注释是有意测试的,否则编译器使用f(const char *)
.
那么,为什么编译器会选择f(const void*)
呢f(const std::string &)
?
解决方案
转换为 astd::string
需要“用户定义的转换”。
转换为void const*
没有。
用户定义的转换在内置转换之后排序。
推荐阅读
- symfony - Symfony [错误] 数据库模式与当前映射文件不同步?
- javascript - VueJS:如何返回 3 个新数组,每个数组中的项目数量相等,除了最后一个数组?
- powershell - 如何使用 PowerShell 和 selenium 从下拉菜单中获取选项和值
- python - 如何在 Pandas Merge 操作期间应用过滤条件但将它们保留在结果 DF 中?
- ldap - Python LDAP:递归获取所有组成员身份
- flutter - Fluttter 错误:主体可能正常完成,导致返回“null”,但返回类型可能是不可为空的类型
- java - CachedRowSet 分页和连接池
- c++ - 可以在 C++ 中使用子类名来引用方法吗?
- c# - 浮点 Equals 和 C# 中的等式运算符 (==) 有什么区别?
- javascript - 期望的数字,得到字符串