2014-02-26 95 views
8

下面的代碼compiles返回類型推演遞歸函數

auto foo(int i) { 
    if(i == 1) 
    return i; 
    else 
    return foo(i-1)+i ; 
} 

雖然以下doesn'tc++1y

auto foo(int i) { 
    return (i == 1) ? i : foo(i-1)+i ; 
} 

爲什麼不能編譯器推斷在第二種情況下,返回類型?我在這裏錯過了什麼嗎?

我知道在第二種情況下(i == 1)之後有一個序列點,但這不應該影響編譯,對吧?

+1

我認爲在第一種情況下,編譯器會從'return i;'中推導出返回類型,而只是再次檢查第二個'return'語句返回的是相同類型。在你的第二個例子中,這是不可能的。但我不確定這一點,即使這是編譯器所做的,我也不知道當前提出的措辭需要什麼。 – hvd

+0

如果將第一個示例的邏輯更改爲「i!= 1」,則它也不會編譯。 –

+0

因此,添加一個'if(false)return int()'會修復第二個例子嗎?對於無法訪問的代碼,這是一個相當令人驚訝的效果。 – MSalters

回答

11

的首部作品,因爲這條規則,對latest draft

7.1.6.4/11一旦return語句在函數被看到的,但是,從該語句推斷返回類型 可以使用在函數的其餘部分,包括其他return聲明。

因此,返回類型從第一個return聲明推斷爲int;第二個只是檢查,以確保它也給出int,假設遞歸調用。

第二個不編譯,因爲表達式的類型取決於返回類型;所以這個類型不能被推斷出來。