C++函数重载优先级
C++ function overload priority
为什么代码会给出输出:bool
?有什么方法可以使const char*
与string
版本相匹配吗?
#include <string>
#include <iostream>
void func(bool)
{
std::cout << "bool" << std::endl;
}
void func(const std::string&)
{
std::cout << "string" << std::endl;
}
int main(int argc, char* argv[])
{
func("hello");
}
发生这种情况是因为编译器更喜欢内置转换而不是用户定义的转换。从指针到bool
的转换是内置的,因此选择重载而不是构造std::string
。
您可以添加一个重载,该重载需要const char*
并将其转发到std::string
版本:
void func(const char* arg)
{
func(std::string{arg});
}
要回答原因:
函数匹配是编译器选择要在重载集中调用哪个函数的过程。在这里,有两个可行的候选函数(您定义的两个函数(。为了选择一个,编译器对它们所暗示的转换进行排名。
第一个候选void func(bool)
意味着数组到指针的转换,然后是布尔转换(从const char[6]
到const char*
到bool
(第二个候选者意味着用户定义的转换(调用std::string
ctor进行const char*
(
第二次转换的排名较低,因此第一个候选项被选为最佳匹配项。
根据标准 N4431 §13.3.3.2/2 对隐式转换序列 [over.ics.rank] 进行排名(强调我的(:
当比较隐式转换序列的基本形式时(如 在 13.3.3.1( (2.1( 中定义 — 标准转换序列 (13.3.3.1.1( 是比用户定义的更好的转换序列 转换序列或省略号转换序列,以及 (2.2( — a 用户定义的转换序列 (13.3.3.1.2( 是更好的转换 序列比省略号转换序列(13.3.3.1.3(。
因此,由于bool
char const *
是标准隐式转换,而隐式转换为std::string
因此,用户定义的转换是更好的转换,并且在过载分辨率方面是首选。
要强制重载解析选择std::string
版本:
func(std::string("hello"));
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么在优先级队列中使用容器参数进行重载?
- 好友与成员运算符重载的优先级
- 函数重载优先级(引用)
- 函数重载和模板扣除优先级
- 优先级队列中的运算符重载或比较功能C++
- 运算符重载,成员函数和非成员函数,哪一个具有优先级
- 如何在重载函数时赋予数据类型优先级
- 优先级队列的重载运算符
- 具有相同名称的不同函数模板之间的重载优先级
- 默认参数 v 模板重载解析中的优先级
- 是否有任何语言允许重载运算符优先级
- 了解具有最小stl优先级_queue的运算符()重载
- 手动确定重载函数的优先级
- STL优先级队列和指针重载
- 重载运算符<用于优先级队列
- C++函数重载优先级