void(int)和void(*)(int)之间的区别是什么?

时间:2016-10-14 11:28:58

标签: c++ c++11

我知道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)?

1 个答案:

答案 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*的方式。