和有什么区别
typedef double F(double)
和
typdedef double (*FPT)(double);
?
在我看来,我可以将两者都作为参数传递给函数,即
bar1(FPT f);
bar2(F f);
但虽然我能做到
FPT f = &foo;
我不能做
F f = foo;
即我不能创建F 类型的变量?
和有什么区别
typedef double F(double)
和
typdedef double (*FPT)(double);
?
在我看来,我可以将两者都作为参数传递给函数,即
bar1(FPT f);
bar2(F f);
但虽然我能做到
FPT f = &foo;
我不能做
F f = foo;
即我不能创建F 类型的变量?
你在很多方面都是对的。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
}
在参数列表中,函数类型衰减为适当的函数指针类型,这样可以像在参数列表中一样传递相同类型的函数,它本身会衰减为相同的指针类型。
这对数组同样适用;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 returningT
" is adjusted to be "pointer toT
" or "pointer to function returningT
," 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.