2013-07-15 31 views
1

有時候我寫如下代碼爲什麼你可以把一個函數原型放入函數中?

struct Bob 
{ 
    Bob() {} 
}; 

int main() 
{ 
    Bob b(); 
} 

我想要做的就是創建一個對象B,使用Bob的默認構造函數。要解決它,我必須刪除b後的括號。事實證明,編譯器將該行解釋爲函數原型,否則!

好吧,我可以理解,遵循規則。但是爲什麼你可以在函數裏面放一個函數原型呢?什麼目的?

+3

這只是一個正常的聲明(不管它是多麼的令人頭疼)(http://en.wikipedia.org/wiki/Most_vexing_parse)。您必須在C++中的*聲明*和*定義*之間有所不同。 –

+0

因爲那時標準會更長。 –

+0

但爲什麼?我確信編譯器可以知道它何時位於函數體內,因此選擇其他解釋。 –

回答

2

大概是因爲在C語法中沒有其他可能的意義(沒有成員函數或構造函數),所以他們指定它是一個函數聲明。

然後,當C++從C繼承了功能時,它們無法改變這種構造的含義而不會冒現存代碼的破壞風險。

如果你問他們爲什麼允許本地函數聲明,那可能是因爲他們想讓函數的範圍儘可能緊密地使用,或者它可能只是失去了時間。

相關問題