函数指针重载函数
Function overloading by function pointer
有一个关于重载函数的问题。看看这个代码:
#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限定符在形成函数类型。
是的,不能基于非指针/非引用参数的常量重载函数,请参阅:带有常量参数和重载的函数
这反过来意味着,指向按值接受参数和常量值的函数的指针是相同的类型。
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载