有一个关于重载函数的问题。看看这段代码:
#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。
答案 0 :(得分:3)
是的,顶级const将被删除。来自gcc的错误
重新定义'void fm(void(*)(int))'
如你所见,const被删除了。
引自N3376 8.3.5 / 5
生成参数类型列表后,任何顶级 修改参数类型的cv-qualifiers在形成时删除 功能类型。
答案 1 :(得分:2)
是的,您不能根据非指针/非引用参数的常量重载函数,请参阅: Functions with const arguments and Overloading
这反过来意味着通过值和const值接受参数的函数指针是相同的类型。