我知道void (*)(int)
是函数指针但是是什么void(int)
?
它用于std::function
模板.
说我有一个功能void fun(int){}
:decltype(&fun)
给予void(*)(int)
但decltype(fun)
给予void(int)
Ker*_* SB 15
如果T
是类型,则T*
表示类型"指向 - T
".
类型void(int)
是一个函数类型,它是一个函数的类型int
并返回void
.例如,f
if 的类型f
声明为void f(int);
如果T = void(int)
,则T*
拼写void(*)(int)
,所以后者是函数指针的类型.您还可以形成对函数的引用,即T& = void(&)(int)
; 这有时更有用(例如,您可以获取函数lvalue的地址).
除了注意:函数左值很容易衰减到它们的函数指针.您可以通过函数左值或函数指针调用函数.当用作间接运算符(*
)的操作数时,函数值会衰减,因此您可以反复取消引用指针:
printf("Hello world\n"); // OK
(*printf)("Hello world\n"); // also OK
(****printf)("Hello world\n"); // four-star programmer
Run Code Online (Sandbox Code Playgroud)
函数不衰减的一些唯一时间是用作address-of运算符的操作数,或者绑定到引用时:
void f(int); // our example function
void(*p1)(int) = &f; // no decay of "f" here
void(*p2)(int) = f; // "f" decays
void(&r1)(int) = f; // no decay of "f" here
void g(void(&callback)(int), int n) {
callback(n);
}
g(f, 10); // no decay of "f" here
template <typename F, typename ...Args>
decltype(auto) h(F&& callback, Args&&... args) {
return std::forward<F>(callback)(std::forward<Args>(args)...);
}
h(f, 10); // no decay of "f" here
Run Code Online (Sandbox Code Playgroud)
void (*whatever)(int)
Run Code Online (Sandbox Code Playgroud)
应该被理解为:无论是指向函数的指针,都接受一个int作为参数,并且不返回任何内容(即,void).
void whatever(int)
Run Code Online (Sandbox Code Playgroud)
应该被理解为:无论是函数(不是指针),接受一个int作为参数,并且什么都不返回(即,void)
一旦指向函数的指针被初始化为指向有效函数(满足原型的函数),那么您可以通过其"真实"名称或通过指针调用该函数.
指向函数的指针非常有用 - 它们是变量,就像其他任何东西一样,所以你可以将它们传递给其他函数(参见例如qsort()),你可以将它们放在结构体中等等.
鉴于此,以下代码有效:
#include <stdio.h>
void myfun(int x) {
printf("The value of X is %d\n", x);
}
int main() {
void (*myfunp)(int);
myfunp = &myfun;
myfun(13);
myfunp(12);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6202 次 |
最近记录: |