c++ - 函数类型与函数指针类型

标签 c++

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

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 出现编译错误。但在第一个示例中,我可以调用函数调用 g(blah),这看起来与 goo = blah 非常相似。为什么一个有效而另一个无效?

最佳答案

有点令人迷惑的是,你可以声明一个函数来接受一个函数作为参数(尽管这没有任何意义),其效果是使参数成为一个函数指针。这类似于声明一个看起来像数组但实际上是指针的函数参数的方式。

函数参数可以是函数名,带或不带 &明确获取其地址。如果省略 & ,然后有一个隐式函数到指针的转换。同样,这类似于传递一个(指向)数组的指针,其中隐式数组到指针的转换意味着您只需要写数组的名称,而不是 &array[0]。 .

声明变量时该规则不适用; int goo(int); (在 goo 周围有或没有不必要的括号)声明一个函数,而不是一个指针,并且您不能分配给函数。

关于c++ - 函数类型与函数指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23219227/

相关文章:

使用类模板的 C++ 循环依赖 - 如何重构?

c++ - 如何使用 enable_if 来限制整个类(class)

C# 没有从非托管 C++ dll 中捕获未处理的异常

c++ - 如何为 adobe air(或 flex)编写 c/c++ 扩展

c++ - 为什么我不能访问我的 DLL 函数

c++ - 将 s.at(i) 与一个字符进行比较?

c++ - 我怎样才能克服 "unsafe"错误?

c++ - 在 Mac 上找不到 Qt 库

c++ - 组最高值的最小可能总和

c++ - 引用可以代替指针吗?