下面的代碼compiles:返回類型推演遞歸函數
auto foo(int i) {
if(i == 1)
return i;
else
return foo(i-1)+i ;
}
auto foo(int i) {
return (i == 1) ? i : foo(i-1)+i ;
}
爲什麼不能編譯器推斷在第二種情況下,返回類型?我在這裏錯過了什麼嗎?
我知道在第二種情況下(i == 1)
之後有一個序列點,但這不應該影響編譯,對吧?
我認爲在第一種情況下,編譯器會從'return i;'中推導出返回類型,而只是再次檢查第二個'return'語句返回的是相同類型。在你的第二個例子中,這是不可能的。但我不確定這一點,即使這是編譯器所做的,我也不知道當前提出的措辭需要什麼。 – hvd
如果將第一個示例的邏輯更改爲「i!= 1」,則它也不會編譯。 –
因此,添加一個'if(false)return int()'會修復第二個例子嗎?對於無法訪問的代碼,這是一個相當令人驚訝的效果。 – MSalters