函数类型与函数指针类型
function type vs. function pointer type
我试图理解以下两个代码块之间的区别:
void f(int (*func)(int))
{
func(5);
}
和
void g(int (func)(int))
{
func(5);
}
给定以下代码,两个功能的工作方式相同:
int blah(int a)
{
cout << "hello" << endl;
return 0;
}
int main()
{
f(blah);
g(blah);
return 0;
}
但是,如果我写以下代码:
int (*foo)(int);
int (goo)(int);
foo = blah;
goo = blah;
我收到goo=blah的编译错误。但在第一个例子中,我可以调用make函数调用g(blah),这似乎与goo=blah非常相似。为什么一个有效而另一个无效?
有些令人困惑的是,您可以声明一个函数将一个函数作为参数(即使这毫无意义),其效果是使该参数成为函数指针。这类似于您可以声明一个看起来像数组但实际上是指针的函数参数的方式。
函数参数可以是函数的名称,可以使用或不使用&
来显式获取其地址。如果省略&
,则存在一个隐式函数到指针的转换。同样,这类似于向数组传递(指针),其中隐式的数组到指针转换意味着您只需要写入数组的名称,而不需要写入&array[0]
。
声明变量时,该规则不适用;int goo(int);
(在goo
周围有或没有不必要的括号)声明了一个函数,而不是指针,并且不能分配给函数。
它类似于数组和指针之间的区别,例如,如果您有:
char *foo;
char bar[N];
你可以做:
foo = bar;
但你不能做:
bar = foo;
当函数类型用于参数声明时,它被转换为等效的函数指针,就像声明:
void fun(int arr[]);
翻译为:
void fun(int *arr);
相关文章:
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- 关于 C++ 中的函数类型定义
- 用于检测函数类型是否为否的特征
- 函数类型参数的模板参数推导
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++无效的函数类型转换
- STL 函数和函数类型与函数指针类型
- 如何将result_of与函数类型定义一起使用
- 将模板(没有规范)传递给 std::thread() 会出现错误:<未解析的重载函数类型>匹配错误
- C++ 编译错误:gnu_printf是无法识别的格式函数类型
- 专门用于"direct"函数类型(与函数指针类型相对)
- 将函数类型作为模板参数传递不会编译
- 通过参数传递 lambda(无函数类型模板)
- 如何在模板参数中分离函数类型返回类型和参数
- 为什么比较函数类型需要指定为模板参数?
- 带有限定符的函数类型定义用例
- 如何声明对函数类型的常量引用
- 非类型模板参数允许各种函数类型?