通过函数指针重载函数

问题描述:

存在关于重载函数的问题。看看这个代码:通过函数指针重载函数

#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),则所有编译成功。但是,如果我们使用引用它编译好。不明白为什么,请你解释一下吗?这是否意味着通过值和const值接受参数的函数指针是相同的类型?

UPD: Top-level const doesn't influence a function signature 有一个很好的解释,为什么顶级const应该被删除。

是的,顶级常量将被丢弃。从GCC错误

的“无效FM(无效(*)(INT))”

正如你看到的常量重新定义被丢弃。从N3376 8.3.5

报价/ 5

生产参数类型的列表后,任何顶级 cv修饰符修改的参数类型形成 函数类型时被删除。

+0

为什么它的价值下降,而不是参考下降? – brachistochron 2015-03-19 09:11:41

+0

@brachistochron只是因为引用中的const不是顶级const。 – ForEveR 2015-03-19 09:21:46

+0

是的,明白了,谢谢。但仍然无法理解为什么它以这种方式工作=) – brachistochron 2015-03-19 09:24:37

是的,你不能超载基于非指针/非引用参数的常量内斯功能,请参阅: Functions with const arguments and Overloading

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