C++ - 关于函数指针的问题

q09*_*987 8 c++ pointers

我写了以下代码:

#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之间没有区别.那是对的吗?

谢谢

Cha*_*via 8

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)

......现在它汇编了.

  • 为了帮助迂回曲折的+1,这让我内心的C++程序员微笑. (3认同)