2016-10-14 2 views
2

void (*) (int)가 함수 포인터임을 알고 있습니다. 그러나 나는 void (int)를 혼동합니다. 첫째, 그들은 서로 다른 유형의 I는 함수 포인터를 사용하여 B 형의 변수를 초기화 할 수 있습니다 void (int)와 void (*) (int)의 차이점은 무엇입니까?

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

하지만이있어
void func(int x){ 
    cout<<x<<endl; 
} 
B b { func }; //ok 
A a { func }; //error 
A* ap { func }; //ok 

그러나 함수 매개 변수 유형으로 사용하는 경우, 그들은 exchangable 것 같다

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을 사용하여 습지 표준 함수 포인터를 선언 할 것이다. 예를 들어 std::vector<int> 또는 int*을 대신 사용하는 것과 같습니다.

관련 문제