【问题标题】: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 可用于声明函数,但不得用于定义函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2013-09-09
        • 2015-01-05
        相关资源
        最近更新 更多