0

和有什么区别

typedef double F(double)

typdedef double (*FPT)(double);

?

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

bar1(FPT f);
bar2(F f); 

但虽然我能做到

FPT f = &foo;

我不能做

F f = foo;

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

4

2 回答 2

5

你在很多方面都是对的。F是函数类型,FPT是函数指针类型。

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

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

FPT f1 = &foo;
F * f2 = &foo;
F & f3 = foo;

另请参阅此答案

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

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

    // "&f" and "std::decay<F>::type" still make sense
}
于 2012-11-06T20:24:57.973 回答
0

在参数列表中,函数类型衰减为适当的函数指针类型,这样可以像在参数列表中一样传递相同类型的函数,它本身会衰减为相同的指针类型。

这对数组同样适用;void foo(int arg[4])具有实际的第一个参数类型int *

8.3.5 函数[dcl.fct]

5 - [...] After determining the type of each parameter, any parameter of type "array of T" or "function returning T" is adjusted to be "pointer to T" or "pointer to function returning T," respectively. [...]

The use of a function type in a declaration is covered in the same section:

10 - A typedef of function type may be used to declare a function but shall not be used to define a function.

于 2012-11-06T20:25:14.953 回答