C++ 函数和函数指针作为参数的区别

C++ 函数和函数指针作为参数的区别,c++,function-pointers,C++,Function Pointers,这是一个相当简单的问题,让我有点好奇。考虑下面的代码片段: #include <iostream> int three() { return 3; } void foo(int func(void)) { std::cout << func() << std::endl; } void bar(int (*func)(void)) { std::cout << func() << std::endl; }

这是一个相当简单的问题,让我有点好奇。考虑下面的代码片段:

#include <iostream>

int three()
{
    return 3;
}

void foo(int func(void))
{
    std::cout << func() << std::endl;
}

void bar(int (*func)(void))
{
    std::cout << func() << std::endl;
}

int main()
{
    foo(three);
    bar(three);
    return 0;
}

// output:
// 3
// 3
如您所见,我们有两个函数,它们将另一个函数作为唯一的参数。但是,它们的功能原型有所不同。主要有void fooint funcvoid和void barint*funcvoid。乍一看,foo似乎是在获取函数本身,bar是在获取指向函数的指针

然而,它们都产生完全相同的结果,具有完全相同的主体,并且以完全相同的方式调用

我的问题是,foo和bar之间有没有隐藏的区别?这只是C++中的一个可选语法吗?在C++中,这两种情况是否被认为是坏的风格?
如果我的编译器是一个促成因素,那么我使用的是Visual Studio 2010。

没有区别:foo和bar的类型是相同的:intint*

没有函数类型参数:当参数以函数类型语法(如int funcvoid)出现时,它将转换为指向函数类型(如int*funcvoid)的相应指针


转换与使用数组语法声明的参数(例如int a[])转换为相应的指针类型int*a的方式类似。

它与此无关。@overcoder:删除了标记。: