2017-08-12 7 views
3

AFAIK, im folgenden Code die Lebensdauer der Referenz ro1 wird bis zum Ende des Bereichs erweitert (Funktion g()):Verlängert eine Referenz auch ihre Lebensdauer?

class Some { 
    // Implementation here 
}; 
Some f() { 
    return Some(/* constructor parameters here*/); 
} 
void g() { 
    Some&& ro1 = f(); 
    // ro1 lives till the end of this function 
} 

Wie über diese Referenz Rückkehr? Bleibt das Objekt noch in g1() oder wird es beim Ausgang von h() zerstört?

Some&& h() { 
    Some&& ro1 = f(); 
    // Code skipped here 
    return std::forward<Some>(ro1); 
} 

void g1() { 
    Some&& ro2 = h(); 
    // Is ro2 still refering to a valid object? 
} 
+0

Keine Lebensdauerverlängerung für Ihr zweites Snippet. – Jarod42

+1

** Wenn ** es 'std :: forward ' war, dann kann eine Move-Konstruktion erwartet werden. Aber in Ihrem zweiten Ausschnitt, ** seit ** ist es ein 'std :: forward ', so vermeidet es jede Konstruktion und hinterlässt eine freie Referenz –

+0

Nein, wenn 'g' zurückkehrt, wird das lokale temporäre zerstört und Sie bleiben mit a hängende Referenz. Auch ich dachte, Referenz Erweiterung war nur für const ref nicht rvalue ref - ich etwas fehlt, hat sich das in C++ 1z geändert? –

Antwort

5

Wie über diese Referenz Rückkehr? Wird noch das Objekt in leben g1()

Nr Verlängerung der Lebensdauer ist etwas, das nur ein einziges Mal passiert. Die von f() zurückgegebene temporäre ist an die Referenz ro1 gebunden und ihre Lebensdauer wird für die Lebensdauer dieser Referenz verlängert. Die Lebensdauer von ro1 endet am Ende von h(), so dass jede Verwendung von ro2 in g1() eine freie Referenz ist.

Damit dies funktioniert, müssen Sie mit Werten tun:

Some h() { 
    Some ro1 = f(); 
    // Code skipped here 
    return ro1; 
} 

Beachten Sie, dass RVO noch hier gilt.

Verwandte Themen