繁体   English   中英

C++ function 指针在声明和参数

[英]C++ function pointer at declaration and argument

我对使用 C++ function 指针感到困惑。

using fn_p1 = void(int);  // function pointer
using fn_p2 = void (*)(int);

void functional(fn_p1 f) {
    f(1);
}

void callback(int value){
    // do something
}

int main() {
    fn_p2 f = callback; //works
    fn_p1 f1 = static_cast<fn_p1>(f); //does not work
    fn_p1 f2 = callback; //does not work
    fn_p1 f2 = static_cast<fn_p1>(callback); //does not work

    functional(f);  // works, the argument is form of void(*)(int)
    f(1);           // works
    
    functional(*f);  // works, the argument is dereferenced, void(int)
    (*f)(1);         // works
    return 0;
}

我知道如果你用f(1)(*f)(1)(*****f)(1)调用 function 指针没有区别。 我不明白functional(f); 有效,但fn_p1 f1 = static_cast<fn_p1>(f); 及其变体不能,因为它们将 function 指针定义为using fn_p1 = void(int); . 谁能解释 function 指针如何工作或编译器如何处理它?

IDE 应该给您的最有用的错误是fn_p1 f2 = callback;

非法初始化器(只能初始化变量)[illegal_initializer]

(这是我从clangd那里得到的信息。)

从字面上看,这意味着void(int)类型的实体(或更一般的someReturnType(someArgTypes...) )不是变量。

Indeed, in C++ functions are not first class, which means that you can't pass them to function and don't get them in return from function; 当你认为你成功地这样做时,你实际上是在传递或收回 function 指针。

换句话说,C++ 中没有“function 值”这样的东西。 函数不是您可以分配的值。

当你写

fn_p1 f2 = callback; // assuming using fn_p1 = void(int);

您确实在尝试创建void(int)类型的变量。 但是这样的事情不存在,因此错误。

static_cast的工作原理基本相同。


至于

void functional(fn_p1 f) {
    f(1);
}

函数到(函数)指针衰减正在发生。 f确实属于fn_p1*类型。

您可以通过在functional中编写无效语句来轻松验证它,以触发编译器错误,告诉您f的类型是什么,就像这样

void functional(fn_p1 f) {
    int foo = f;
    f(1);
}

Clangd 回答了这个问题

无法使用“fn_p1 ”类型的左值(又名“void ( )(int)”)初始化“int”类型的变量 [init_conversion_failed]

它间接告诉您f的类型为fn_p1* ,因此您最好将其写为functional参数的类型不是fn_p1 ,至少为了清楚起见(类似于您应该更喜欢将T*而不是T[]写为function 中的参数类型采用T s 的 c 样式数组)。


如果您真的想将函数分配给变量,您应该查看lambdasstruct s+ operator()std::function以及function 对象的主题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM