folgenden Code compiles:in rekursive Funktion Typ Abzug Return
auto foo(int i) {
if(i == 1)
return i;
else
return foo(i-1)+i ;
}
Während doesn't folgende, c++1y
auto foo(int i) {
return (i == 1) ? i : foo(i-1)+i ;
}
Warum kann Compiler den Rückgabetyp in zweiten Fall ableiten? Fehle ich etwas hier drüben?
Ich weiß, es gibt einen Sequenzpunkt nach (i == 1)
im zweiten Szenario, aber das sollte nicht die Kompilierung beeinflussen, nicht wahr?
Ich denke im ersten Fall, der Compiler leitet den Rückgabetyp von 'return i;', und überprüft nur doppelt, dass die zweite 'return' Anweisung den gleichen Typ zurückgibt. In Ihrem zweiten Beispiel ist das nicht möglich. Aber ich bin mir nicht sicher, und selbst wenn das der Compiler tut, weiß ich nicht, was der aktuelle Wortlaut der Formulierung erfordert. – hvd
Wenn Sie die Logik Ihres ersten Beispiels in "i! = 1" ändern, wird es auch nicht kompiliert. –
Also würde das Hinzufügen eines 'if (false) return int()' das zweite Beispiel beheben? Das ist ein ziemlich überraschender Effekt für unerreichbaren Code. – MSalters