我写了以下代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
double funcA()
{
return 100.0;
}
int g(double (*pf)())
{
cout << (*pf)() << endl;
return 0;
}
int g2(double pf())
{
cout << pf() << endl;
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
g(&funcA); // case I
g(funcA); // case II
g2(funcA); // case III
g2(&funcA); // case IV
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在VS2008上运行了上面的代码,每个函数调用返回'100'.这是一个问题:
Q1>代码中有问题吗?
Q2>似乎C++在*pf和pf之间没有区别.那是对的吗?
谢谢
C++ 不,其实使类型之间的区别double()和double(*)(),但不同的是微妙的.将函数类型作为参数传递给函数时,函数类型会自动"降级"为函数指针.(这是类似的,我想,对数组类型如何降解为当作为函数参数传递指针类型.)
但是,根据C++类型系统,函数类型和函数指针类型仍然是不同的类型.考虑以下情况:
void g() { }
template <class F>
struct Foo
{
Foo(const F& f) : func(f)
{ }
void operator()() { func(); }
F func;
};
int main ()
{
Foo<void()> f(g);
f();
}
Run Code Online (Sandbox Code Playgroud)
这应该无法编译,因为您不能将函数类型声明为自动变量.(请记住,函数不是C++中的第一类对象.)因此声明F func;无效.但是,如果我们将main函数更改为使用函数指针实例化模板,如下所示:
int main ()
{
typedef void(*function_pointer)();
Foo<function_pointer> f(g);
f();
}
Run Code Online (Sandbox Code Playgroud)
......现在它汇编了.