2016-10-14 11 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の変数を初期化ではなく

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()>; bog-standard関数ポインタを宣言するのにBを使用します。これは、あなたがstd::vector<int>、またはint*を代わりに使用するようなものです。

関連する問題