2015-01-17 2 views
4

이 프로그램은 :기본 인수가있는 함수에서 함수를 호출 할 수없는 이유는 무엇입니까?

#include <iostream> 

void foo(void (*bar)()){ bar(); }; 

void foo(int a = 5) 
{ 
    std::cout << a << std::endl; 
} 

int main() 
{ 
    foo(foo); //Error 
} 

DEMO

나는 결국 foo(5)가 호출 될 것으로 예상. 반면, 다음과 같은 프로그램은 잘 작동 :

#include <iostream> 

void foo(void (*bar)()){ bar(); }; 

void foo() 
{ 
    std::cout << 5 << std::endl; 
} 

int main() 
{ 
    foo(foo); //OK 
} 

DEMO

당신이 그 차이를 설명 할 수 있을까요?

+7

기본 인수가 있으면 함수의 서명이 변경되지 않습니다. 또한 컴파일러는 callsite에 기본 인수를 추가합니다. 제공하지 않으면 함수에 대한 포인터를 만들 때가 아닙니다. – Praetorian

+0

@Praetorian 그래서 첫 번째 경우에 함수를 어떻게 호출 할 수 있습니까? –

+2

나는 할 수 있다고 생각하지 않는다. 함수에 대한 포인터를 살펴보면 기본 인수에 대한 정보가 손실되지만 잘못되었을 수 있습니다. – Praetorian

답변

2

첫 번째 예제에서 foo는 기본 인수가 있지만 그 유형은 void (bar *) (int)입니다. 기본 인수를 가짐으로써 명시 적으로 인수 값을 지정하지 않고 foo를 호출 할 수 있지만 여전히 int 인수가 있습니다. 그 값은 자동으로 채워집니다 (컴파일 중).