有一个关于重载函数的问题.看看这段代码:
#include<iostream> void fv(int){} void fc(const int){} void fvr(int&){} void fcr(const int&){} void fm(void(*fun)(const int)) { std::cout << "Constant called" << std::endl; } //void fm(void(*fun)(int)) //{ // std::cout << "non Constant called" << std::endl; //} void fm(void(*fun)(const int&)) { std::cout << "Constant ref called" << std::endl; } void fm(void(*fun)(int&)) { std::cout << "non Constant ref called" << std::endl; } int main() { fm(&fc); fm(&fv); fm(&fvr); fm(&fcr); return 0; }
如果取消注释void fm(void(* fun)(int))函数,你会发现编译器不能通过函数上的指针静态地重载函数,该函数接受按值接受的参数和接受const值的函数上的指针.另外,如果取消注释void(* fun)(const int)和注释void(* fun)(const int),那么所有编译都是成功的.但是,如果我们使用引用它编译好.不明白为什么,你能解释一下吗?这是否意味着通过值和const值接受参数的函数指针是相同的类型?
UPD:
Top-level const doesn’t influence a function signature
有一个很好的解释为什么应该删除顶级const.