用C++很久了, 但还是有遗漏的知识点, 观察如下代码:
void func(){}
void func(int){}
auto funcHandle = &func
这段代码无法编译通过,提示编译器不能推断出&func的类型, 原因就是func函数有重载, 不论是
void func(){}
还是
void func(int){}
获取函数地址时都是用的表达式&func
之前我的认识是, 无论什么字面量,只要写出来,就能确定其类型, 如:1是int, 1u是unsigned int
void test(int){ std::cout<<"int"<<std::endl; }
void test(unsigned int){ std::cout<<"unsigned int"<<std::endl; }
test(1);
test(1u);
两次调用分别是不同的重载函数.
但重载函数变量并非如此,
对于重载函数, 即使是字面量表达式语句也会编译不过
1; // 可以编译通过
&func; // 编译失败: statement cannot resolve address of overloaded function
所以对于重载函数变量的赋值,只能是如下两种写法
void (*funcHandle)() = &func;
auto funcHandle1 = (void (*)(int)) &func