我知道void(*)(int)是一个函数指针。但我真的很困惑void(int)。首先,他们是不同类型的
using A = void(int);
using B = void(*)(int);
is_same<A*, B>::value == true
我可以使用函数指针而不是A
初始化类型B的变量void func(int x){
cout<<x<<endl;
}
B b { func }; //ok
A a { func }; //error
A* ap { func }; //ok
但是如果用作函数参数类型,它们似乎是可以交换的
void callA(A a, int arg){ a(arg); }
void callB(B b, int arg){ b(arg); }
callA(func, 1); //ok
callB(func, 1); //ok
那么什么是void(int)呢?我什么时候应该使用void(int),什么时候应该使用void(*)(int)?
答案 0 :(得分:3)
您的A
是函数类型,而B
是函数指针类型。
您已正确识别这些是不同的类型,但当您使用A
作为参数时,它会默默地转换为B
(为了“方便”):
[C++14: 8.3.5/5]:
[..] 确定每个参数的类型后,“T
数组”或“返回T
的函数”类型的任何参数被分别调整为“指向T
”或“指向函数返回T
的指针”。 [..]
因此,在这种情况下,它可以说与你使用的无关。
否则,您可以在期望实际功能类型的模板参数中使用A
,例如std::function<void()>
;你可以使用B
来声明一个标准的函数指针。这有点像您使用std::vector<int>
或int*
的方式。