通过函数指针重载函数
问题描述:
存在关于重载函数的问题。看看这个代码:通过函数指针重载函数
#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修饰符修改的参数类型形成 函数类型时被删除。
答
是的,你不能超载基于非指针/非引用参数的常量内斯功能,请参阅: Functions with const arguments and Overloading
这反过来又意味着,指针的值和常量的值函数接受参数是同一类型。
为什么它的价值下降,而不是参考下降? – brachistochron 2015-03-19 09:11:41
@brachistochron只是因为引用中的const不是顶级const。 – ForEveR 2015-03-19 09:21:46
是的,明白了,谢谢。但仍然无法理解为什么它以这种方式工作=) – brachistochron 2015-03-19 09:24:37