c – 函数指针的函数重载

一个关于重载函数的问题.看看这段代码
#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.

解决方法

是的,顶级const将被删除.来自gcc的错误

redeFinition of ‘void fm(void (*)(int))’

如你所见,const被删除了.

引自N3376 8.3.5 / 5

After producing the list of parameter types,any top-level cv-qualifiers modifying a parameter type are deleted when forming the function type.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...