void(int) 和 void (*)(int) 之间的区别
difference between void(int) & void (*)(int)
我知道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
被声明为void f(int);
,则它是f
的类型
如果T = void(int)
,则T*
拼写为void(*)(int)
,因此后者是函数指针的类型。您还可以形成对一个函数的引用,该函数为T& = void(&)(int)
;这有时更有用(例如,您可以获取函数lvalue的地址)。
注意:函数lvalues很容易衰减到它们的函数指针。您可以通过函数左值或函数指针调用函数。当用作间接运算符(*
)的操作数时,函数值会衰减,因此您可以一次又一次地取消引用指针:
printf("Hello worldn"); // OK
(*printf)("Hello worldn"); // also OK
(****printf)("Hello worldn"); // 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
void (*whatever)(int)
应该读作:无论是指向函数的指针,它接受一个int作为参数,但不返回任何内容(即void)。
void whatever(int)
应该读作:无论是一个函数(而不是指针),它接受一个int作为参数,并且不返回任何内容(即void)
一旦一个函数的指针被初始化为指向一个有效的函数(一个满足原型的函数),那么您就可以通过它的"真实"名称或通过指针调用该函数。
指向函数的指针非常有用——它们是变量,就像其他任何东西一样,所以你可以将它们传递给其他函数(参见例如qsort()),你可以将其放入结构中,等等
鉴于此,以下代码是有效的:
#include <stdio.h>
void myfun(int x) {
printf("The value of X is %dn", x);
}
int main() {
void (*myfunp)(int);
myfunp = &myfun;
myfun(13);
myfunp(12);
return 0;
}
void(*)(int)
应被读取为指向function
的指针类型,该指针接受一个int
作为参数,并且不返回任何内容。
要了解更多关于指向指针的函数及其用法的信息,请查看此处:http://www.cprogramming.com/tutorial/function-pointers.html
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 不能使这种类型的"void(C::* volatile)(int) const "在参考手册C++示
- 如何使模板函数像 R f<void(int)>(args...)
- template<class T, int N> void h(T const(&)[N]); as friend function
- 函数 LNK2019 "int __cdecl __scrt_common_main_seh(void)" 中引用的未解析外部符号主错误 (?__scrt_common_main_seh@@YAHXZ
- 从不兼容的类型 'void (Button::*)(int)' 分配给'void (*)(int)'
- 错误:无法将"打印"从"void (*)(int)"转换为"std::function<void()>
- 标准的大小::函数<void(int&)>类型
- std::bind1st是否可以用于将void(*)(void*,int)转换为void(*int)
- "void (*)(int)"与"void (^)(int)"相同吗?
- boost::function<void (int)> 类型兼容性,是怎么做到的?
- void(int) 和 void (*)(int) 之间的区别
- 在Linux上编译简单信号代码时,从void*到void (*) int的无效转换错误
- 错误:将'const Tarih'作为'void(int)' 'this'参数传递丢弃限定符|
- void(int) 和 void(*)(int) 有什么区别?
- 警告(不合时宜):将 void(*)(int) 分配给 extern "C" void(*)(int)
- 为什么 C++11 不支持 'std::function<void(int, ...)>'?
- 为什么在void/int声明后使用const