Folgenden Code kompiliert :
%Vor%Während nicht funktioniert, c ++ 1y
%Vor%Warum kann der Compiler im zweiten Fall den Rückgabetyp nicht ableiten? Fehle ich etwas hier drüben?
Ich weiß, dass es im zweiten Szenario einen Sequenzpunkt nach (i == 1)
gibt, aber das sollte sich nicht auf die Kompilierung auswirken, oder?
Der erste funktioniert wegen dieser Regel, 7.1.6.4/11 des letzten Entwurfs
Sobald eine
return
-Anweisung in einer Funktion gesehen wurde, wird jedoch der Rückgabetyp zurückgegeben von dieser Aussage abgeleitet kann im Rest der Funktion verwendet werden, auch in anderenreturn
-Anweisungen.
Daher wird der Rückgabetyp als int
von der ersten return
-Anweisung abgeleitet; Die zweite wird nur überprüft, um sicherzustellen, dass auch int
zurückgegeben wird, vorausgesetzt, dass der rekursive Aufruf funktioniert.
Die zweite kompiliert nicht, da der Typ des Ausdrucks vom Rückgabetyp abhängt; daher kann der Typ nicht abgeleitet werden.
Eine rekursive Funktion kann nur dann einen automatischen Rückgabetyp haben, wenn sie vor dem rekursiven Aufruf eine nicht-rekursive return-Anweisung hat. Siehe Rückgabetypabzug für normale Funktionen .