2014-11-23 56 views
1

正如您所知,ISO C++標準禁止在函數中返回數組,因爲我認爲這是因爲數組沒有編譯器定義的複製構造函數和賦值運算符。它們只能用const初始化列表'構造',就這些了。所以如果返回數組是可能的,那麼你只能返回const初始化列表,而沒有辦法存儲它們。但是當數組被聲明爲形式參數時,情況就不同了 - 它們總是轉換爲指針。發生這種情況時,如果函數的返回值與類型數組一起使用,它將保持這種方式,並且編譯器會生成錯誤消息,但是當形式參數的類型是數組時,它將保持安靜狀態,並將其隱式轉換爲指針。在標準中這是寫的,爲什麼 - 我的意思是說它有什麼合乎邏輯的原因?爲什麼數組形式參數總是隱式轉換爲指針而不是被禁止?

一些實例來說明這一點:

int func()[5]; 

上述函數聲明將產生以下編譯器錯誤(我使用GNU編譯器):

error: 'func' declared as function returning an array|

然而,如果我聲明上述函數取這樣一個類型數組的形式參數:

void func(int arg[5]); 

它將編譯罰款,它將編譯爲我寫了這個(不僅如此 - 它也將它轉移到它)以同樣的方式:

void func(int *arg); 

編輯:刪除了所有我的「憤怒」的意見,並表示問題(這種行爲是否有合乎邏輯的原因?)。

+0

這是好多了。這個特殊的語法怪癖直接來自C.我還沒有找到解釋其原因的權威來源,但我的猜測是它用作文檔:「這個函數可能需要一個指針,但它會把它當作一個指針指向大小爲N的數組的第一個元素的指針......「這看起來像是一個可怕的想法,並且引起了很多混淆,但是一旦使用該語言,幾乎不可能移除。 – juanchopanza 2014-11-24 09:18:52

+0

直接從C?我認爲,它直接來自B。 – MSalters 2014-11-24 11:09:50

回答

2

Where in the standart this is written

在8.3.5/5:

After determining the type of each parameter, any parameter of type 「array of T」 or 「function returning T」 is adjusted to be 「pointer to T」 or 「pointer to function returning T,」 respectively.

相關問題