【问题标题】:function pointer typedef函数指针类型定义
【发布时间】:2012-11-06 20:14:47
【问题描述】:
有什么区别
typedef double F(double)
和
typdedef double (*FPT)(double);
?
在我看来,我可以将两者都作为参数传递给函数,即
bar1(FPT f);
bar2(F f);
虽然我能做到
FPT f = &foo;
我做不到
F f = foo;
即我无法创建 F 类型的变量?
【问题讨论】:
标签:
c++
function
pointers
function-pointers
【解决方案1】:
你在很多方面都是对的。 F是函数类型,FPT是函数指针类型。
如果你有一个函数类型的对象,你可以获取它的地址并得到一个函数指针。但是,函数类型的对象并不是真正的一流 C++ 对象。只有实际的函数属于这种类型,并且您不能创建作为函数的对象(除了通过声明函数!),因此您不能分配给它(如F f = foo;)。
引用函数的唯一方法是通过函数指针或引用:
FPT f1 = &foo;
F * f2 = &foo;
F & f3 = foo;
另见this answer。
请注意,对于回调,我更喜欢引用类型而不是指针类型,因为与传递任何其他变量的方式相比,它更自然,并且因为您可以将地址和衰减应用于引用并获取指针,这是你不能用指针做的:
double callme(F & f, double val) // not: "F *" or "FPT"
{
return f(val);
// "&f" and "std::decay<F>::type" still make sense
}
【解决方案2】:
在参数列表中,函数类型会衰减为适当的函数指针类型,这样可以像在参数列表中一样传递相同类型的函数,而它本身会衰减为相同的指针类型。
这同样适用于数组; void foo(int arg[4]) 具有实际的第一个参数类型 int *。
8.3.5 函数[dcl.fct]
5 - [...] 在确定每个参数的类型后,将任何类型为“T”或“函数返回T”的参数调整为“指向T”或“的指针”指向函数的指针分别返回T,"。 [...]
在声明中使用函数类型在同一部分中介绍:
10 - 函数类型的 typedef 可用于声明函数,但不得用于定义函数。