C++ 函数类型与函数指针类型

C++ 函数类型与函数指针类型,c++,C++,我试图理解以下两段代码之间的区别: void f(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); f

我试图理解以下两段代码之间的区别:

void f(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。为什么一个可以工作而另一个不能工作?

有些令人困惑的是,您可以声明一个函数以函数作为参数(即使这没有意义),其效果是将参数作为函数指针。这与声明函数参数的方式类似,函数参数看起来像数组,但实际上是指针

函数参数可以是函数的名称,可以使用或不使用
&
来显式获取其地址。如果省略
&
,则存在一个隐式函数到指针的转换。同样,这类似于将(指针)传递给数组,其中隐式数组到指针的转换意味着您只需要写入数组的名称,而不是
&数组[0]


该规则在声明变量时不适用<代码>int-goo(int)(在
goo
周围有或没有不必要的括号)声明一个函数,而不是一个指针,并且您不能为函数赋值。

这类似于数组和指针之间的区别,例如,如果您有:

char *foo;
char bar[N];
你可以做:

foo = bar;
但你不能这样做:

bar = foo;
在参数声明中使用函数类型时,会将其转换为等效函数指针,就像声明:

void fun(int arr[]);
翻译为:

void fun(int *arr);

@重复数据消除器:不,因为这是不正确的。由于隐式转换,它们有时并不需要。(遗憾的是,如果不打破30多年的遗留代码,禁止隐式转换不是一个选项)。@Deduplicator:事实上,隐式转换意味着通常不需要运算符,它们的效果有时会隐式取消。说它们没有效果仍然是错误的,因为它们确实有效果。但是
*
确实有效果:它取消引用指针以给出函数类型的表达式(同样,它只是显式地做隐式转换所做的事情;但你不能说它根本没有效果,因为它确实有效果)。谢谢你的澄清。这些规则是在C/C++标准中的某个地方编写的吗?
void fun(int *arr);