2016-10-14 181 views
2

我知道void(*)(int)是一个函数指针。但是我真的很困惑void(int)。首先,他们是不同类型的void(int)和void(*)(int)有什么区别?

using A = void(int); 
using B = void(*)(int); 
is_same<A*, B>::value == true 

我可以使用函数指针初始化B型的变量,但不是A

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)?

回答

3

您的A是函数类型,而您的B是指针函数类型。

你已经正确识别它们是不同类型的,但是当你用A作为一个参数,它静静地翻译成B(为“方便”):

[C++14: 8.3.5/5]:[..]确定后每个参数的类型,“T”数组类型或“返回函数T”类型的任何参数分别被调整为“指向T”或“返回函数指针T”。 [..]

所以,在这种情况下,它可以说是不要紧,你使用。

否则,您可以在期望实际功能类型的模板参数中使用A,例如, std::function<void()>;您可以使用B来声明一个bog标准函数指针。这有点像你如何使用std::vector<int>int*

相关问题