2014-02-26 9 views
8

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?

+1

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

+0

Wenn Sie die Logik Ihres ersten Beispiels in "i! = 1" ändern, wird es auch nicht kompiliert. –

+0

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

Antwort

11

Die ersten Arbeiten wegen dieser Regel 7.1.6.4/11 der latest draft

Sobald eine return-Anweisung in einer Funktion gesehen wurde jedoch der Rückgabetyp aus dieser Aussage ableiten kann verwendet werden, im Rest der Funktion, einschließlich in anderen return Aussagen.

So wird der Rückgabetyp als int aus der ersten return Anweisung abgeleitet; Die zweite wird nur überprüft, um sicherzustellen, dass es auch gibt int, vorausgesetzt, dass der rekursive Aufruf tut.

Die zweite kompiliert nicht, da der Typ des Ausdrucks vom Rückgabetyp abhängt; daher kann der Typ nicht abgeleitet werden.

6

Eine rekursive Funktion kann nur dann einen automatischen Rückgabetyp haben, wenn sie vor dem rekursiven Aufruf eine nicht-rekursive return-Anweisung enthält. Siehe Return type deduction for normal functions.