2013-09-16 3 views
7

Was im folgenden Fall geschehen soll:Passing Rückgabewert einer Funktion als Referenz

int functionA() { 
    return 25; 
} 

void functionB(const int& ref) { 
    cout << ref << endl; 
} 

void start() { 
    functionB(functionA()); 
} 

Wenn dieses Beispiel kompilieren, gibt es den richtigen Wert 25. Wie funktionierts? Soll der referenzierte Rückgabewert auf dem Stapel nicht gelöscht (aus dem Stapel entfernt) werden, wenn nur ein Verweis darauf verwendet wird, oder ist das Verhalten nicht definiert?

+1

siehe C++ 11 Standard 12.2/4,5 für die Wirkung von konstanten Referenzen von temporären Objekten – nijansen

Antwort

8

dieses „Werk“ wegen const int& ref - wenn eine Referenz const (garantiert, dass Sie wollen es nicht ändern) ist, der Compiler ein temporäres Objekt im Aufrufcode (start in Ihrem Fall) produzieren, und dann gib den Hinweis darauf weiter.

Wenn Sie const entfernen, wird die Kompilierung fehlschlagen, da das Ergebnis functionA nicht in eine Referenz umgewandelt werden kann.

8

Es gibt keinen „Rückgabewert auf dem Stack“ (geschweige denn einen „Stack“): functionA ein intvon Wert zurückgibt, so der Ausdruck functionA() ist einfach ein temporärer Wert vom Typ int. Dieser Wert bindet an die konstante Referenz in functionB, und da seine Lebensdauer die des vollständigen Ausdrucks ist, ist alles in Ordnung.