函数指针typedef

use*_*652 0 c++ pointers function-pointers function

有什么区别

typedef double F(double)
Run Code Online (Sandbox Code Playgroud)

typdedef double (*FPT)(double);
Run Code Online (Sandbox Code Playgroud)

在我看来,我可以将两者作为参数传递给函数,即

bar1(FPT f);
bar2(F f); 
Run Code Online (Sandbox Code Playgroud)

但是我能做到

FPT f = &foo;
Run Code Online (Sandbox Code Playgroud)

我不能做

F f = foo;
Run Code Online (Sandbox Code Playgroud)

即我不能创建F类型的变量?

Ker*_* SB 5

你在很多方面都是正确的.F是一个函数类型,FPT是一个函数指针类型.

如果你有一个函数类型的对象,你可以获取它的地址并获得一个函数指针.但是,函数类型的对象不是真正的第一类C++对象.只有实际的函数属于这种类型,你不能创建一个函数对象(除了通过声明一个函数!),因此你不能分配给它(如F f = foo;).

您可以引用函数的唯一方法是通过函数指针或引用:

FPT f1 = &foo;
F * f2 = &foo;
F & f3 = foo;
Run Code Online (Sandbox Code Playgroud)

另见这个答案.

请注意,对于回调,我更喜欢指针类型的引用类型,因为它与传递任何其他变量的方式相比更自然,并且因为您可以将地址和衰减应用于引用并获取指针,您可以用指针做:

double callme(F & f, double val)       // not: "F *" or "FPT"
{
    return f(val);

    // "&f" and "std::decay<F>::type" still make sense
}
Run Code Online (Sandbox Code Playgroud)