我知道void (*)(int)
是函数指针,但是什么void(int)
呢?
用于std::function
模板。
说我有一个功能void fun(int){}
:decltype(&fun)
给void(*)(int)
但decltype(fun)
给void(int)
如果T
是类型,则T*
表示类型为“指向-的指针T
”。
类型void(int)
是一个函数类型,它是一个带一个int
返回的函数的类型void
。例如,它是f
iff
声明为的类型void f(int);
如果T = void(int)
,则T*
拼写了void(*)(int)
,则后者是函数指针的类型。您还可以形成对函数的引用,即T& = void(&)(int)
;有时这会更有用(例如,您可以使用函数左值的地址)。
撇开注释:函数左值很容易衰减到其函数指针。您可以通过函数左值或函数指针来调用函数。当用作间接运算符(*
)的操作数时,函数值会衰减,因此可以一次又一次取消引用指针:
printf("Hello world\n"); // OK
(*printf)("Hello world\n"); // also OK
(****printf)("Hello world\n"); // four-star programmer
只有当函数用作地址运算符的操作数或绑定到引用时,函数才不会衰减的某些情况是:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句