函数指针重载函数

Function overloading by function pointer

本文关键字:函数 重载 指针      更新时间:2023-10-16

有一个关于重载函数的问题。看看这个代码:

#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))函数,您会发现编译器无法在接受按值参数的函数上按指针静态重载函数,也无法在接受常量值的函数上静态重载指针。此外,如果取消对void(*fun)(const int)的注释并对void(*fun)(const int)进行注释,则所有编译都将成功。但是,如果我们使用引用,它可以编译。不明白为什么,你能解释一下吗?这是否意味着指向按值和按常量值接受参数的函数的指针是相同的类型?

UPD:顶级const dons';t影响函数签名有一个很好的解释为什么应该删除顶级常量。

是的,顶级常量将被删除。gcc 错误

"void fm(void(*)(int))"的重新定义

正如你所看到的,const被删除了。

N3376 8.3.5/5 报价

生成参数类型列表后,任何顶级修改参数类型的cv限定符在形成函数类型。

是的,不能基于非指针/非引用参数的常量重载函数,请参阅:带有常量参数和重载的函数

这反过来意味着,指向按值接受参数和常量值的函数的指针是相同的类型。