2014-10-20 6 views
1
struct A{ 
    A(){} 
}; 

struct B{ 
    B(const A& a){} 
}; 

int main() 
{ 
//Originally I would like to write down below code 

A a; 
B b(a); 

//Unfortunately I end up with below code by accident and there is no compile error 
//I have figured out the below does not create temporary A and call B constructor to 
//create B as the above codes, 
//it declares a function with return value B, name b, 
//and some input parameter, my question is 1) what the input parameter is ? 
//2) How to implement such a function. 

B b(A()); // There is no global function A() in my test case. 

} 

질문은 의견에 일부 사람들이 나를 이해하는 데 도움이되기를 바랍니다. 고맙습니다.클래스 생성자가있는 함수를 함수 매개 변수로 선언하십시오.

+3

관련 : 가장 성가신 파싱 (http://en.wikipedia.org/wiki/Most_vexing_parse). – dasblinkenlight

답변

3

A (*)() 유형의 단일 매개 변수 즉, 인수가없고 A을 반환하는 함수의 포인터 인 B을 반환하는 함수를 선언합니다. 선언자 A()은 "인수를 취하지 않고 A을 반환하는 함수"를 의미하지만 함수 유형을 갖도록 매개 변수를 선언 할 때마다 함수에 대한 포인터가되도록 다시 작성됩니다. 이 선언의 매개 변수의 이름은 지정되지 않습니다. 원하지 않으면 매개 변수의 이름을 지정할 필요가 없습니다.

과 같은 기능을 구현하면과 같은 정의가 필요합니다. 예 : ,

B b(A a()) { 
    // do something with "a" 
    // note: the type of "a" is still pointer to function 
} 

참조, 예를 들어, Is there any use for local function declarations?

+0

도움을 주셔서 대단히 감사합니다. 요점이 있습니다. 또 다른 질문은 A()가 A (*)()로 확장 될 수있는 이유입니다. 나는 요점을 얻지 못한다. –

+0

@ZhongkunMa'A()는'A' (매개 변수 없음)를 반환하는 함수를 의미하고'A (*)() '는 A를 반환하는 함수를 가리키는 포인터입니다 (다시 매개 변수 없음). 함수를 선언하려고하면 함수의 매개 변수 중 하나가 함수이고 매개 변수의 형식이 해당 함수 포인터 유형이되도록 조정됩니다. – Brian

+0

빠른 응답을 보내 주셔서 다시 한 번 감사드립니다. "B b"함수를 'B (A (a)(), A (* b)(), A (*)(), A());로 선언하면, A returnA() {return A()}; ' b 함수를'b (returnA, returnA, returnA, returnA) '로 호출 할 수있는 이유는 무엇입니까?(), A (*)(), A (*)(), A())'모두 동일합니다, 그렇지 않습니까? 나는 귀하의 회신을 기대하고있다. –

2

B b(A())B을 반환하고 함수 포인터를 인수로 사용하는 함수를 선언합니다. b. 함수 포인터는 A을 리턴하고 인수를 취하지 않는 함수를 가리 킵니다.

+0

함수의 이름은 무엇입니까? 어떻게이 기능을 실현할 수 있을까요? 감사합니다 –

+0

@ ZhongkunMa 이것은'b' 함수에 대한 ** 선언 **이므로 매개 변수 이름은 필요하지 않으며 여기에 아무 것도 주어지지 않습니다. 함수를 구현하려면 ** 정의 ** 함수를 사용하여 이름을 제공해야합니다. –

관련 문제