2015-06-09 211 views
1

這個問題聽起來可能很愚蠢,但爲什麼我們不能這樣做呢?我的意思是,像下面這樣的聲明符:函數返回另一個函數

void (foo())(); 

我讀過當前的C++標準的第8.3.5節並沒有發現它有什麼說有多麼暗示。

這裏是什麼標準說有關:

在聲明TD,其中d的形式

D1 (parameter-declaration-clause) cv-qualifier-seqopt 
ref-qualifieropt exception-specificationopt attribute-specifier-seqopt 

和所包含的說明符的編號,在類型聲明T D1是 「derived-declarator-type-list T」,D 中的聲明符id的類型是「derived-declarator-type-list function of (參數聲明子句)cv-qualifierseqopt ref-qualifieropt 返回T「。

因此,從形式上來說,從這個定義中可以看出,我的declration是一個有效的函數declration。 T D1,在我的情況下是void foo()這是一個完全有效的declration。我錯過了什麼?

+6

你實際上可以返回一個函數指針。這是函數標識符在從其他函數傳遞或返回時衰減的內容。 – StoryTeller

+1

您可以返回'std :: function'對象,如下所示:http://ideone.com/Glc7xs – Chad

回答

7

我還沒有仔細閱讀當前的C++標準

的部分8.3.5明顯。 §8.3.5[dcl.fct]/P8:

功能不應有類型的陣列或功能, 的返回類型,儘管它們可以具有類型的指針或引用的返回類型以 這樣的事情。

1

我認爲這是因爲你不能創建一個函數的臨時對象。但是,如果你打算做這樣的事情,請嘗試返回一個指向函數的指針。試試這個:

int (*fun())(); 

指針值可以由函數返回。你不能返回一個函數,因爲沒有函數類型。

+4

絕對有一個函數類型。實際上有幾乎無限的函數類型... –

+0

我認爲它的難處在於是否存在「函數對象」或「函數值」。函數有一個return _type_,並且一個函數調用(除非它拋出)throw必須返回該類型的值。假設一個函數可能有一個函數類型的返回類型,它的return語句是什麼樣的? – MSalters