Gibt den Typabzug in der rekursiven Funktion zurück

8

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?

    
P0W 26.02.2014, 12:07
quelle

2 Antworten

11

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 anderen return -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.

    
Mike Seymour 26.02.2014, 12:21
quelle
6

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 .

    
Marius Bancila 26.02.2014 12:12
quelle

Tags und Links