2014-10-20 179 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 2014-10-20 21:33:02

回答

3

它聲明瞭一個名爲b的函數,它返回B,它具有A (*)()類型的單個參數,即指向不帶參數的函數的指針並返回A。聲明者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(*)()。我不明白這一點。 – 2014-10-20 21:50:07

+0

@ZhongkunMa'A()'表示函數返回'A'(不帶參數),'A(*)()'表示指向函數返回'A'(不帶參數)的指針。這只是一個規則,如果你試圖聲明一個函數的參數是一個函數,那麼參數的類型會被調整爲相應的函數指針類型。 – Brian 2014-10-20 21:55:56

+0

再次感謝您的快速響應。我測試了一件事,如果我宣佈「B b」函數爲 'B b(A(a)(),A(* b)(),A(*)(),A());' 「返回A」函數爲 'A returnA(){return A()};' 什麼原因可以稱爲b函數爲b(returnA,returnA,returnA,returnA,)'看來'b(A (a)(),A(* b)(),A(*)(),A())'都是完全相同的,對嗎?我期待着您的回覆。 – 2014-10-20 22:06:19

2

B b(A())聲明瞭一個名爲b的函數,它返回B並將函數指針作爲參數。函數指針指向一個返回A並且不帶參數的函數。

+0

函數的名稱是什麼?以及如何實現這個功能?謝謝 – 2014-10-20 21:38:19

+0

@ZhongkunMa由於這是**函數'b'的**聲明,因此不需要任何參數名稱,也不需要在此給出。如果你想實現這個功能,那麼你將被要求提供一個帶有**定義**的名字。 – 2014-10-20 21:39:38

相關問題