2016-10-14 180 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*

相關問題