[英]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 样式数组)。
如果您真的想将函数分配给变量,您应该查看lambdas 、 struct
s+ operator()
、 std::function
以及function 对象的主题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.