2017-08-12 5 views
3

AFAIK, dans le code suivant la durée de vie de la référence ro1 est prolongée jusqu'à la fin de la portée (fonction g()):Le renvoi d'une référence prolonge-t-il également sa durée de vie?

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

Que diriez-vous de retourner cette référence? l'objet va vivre encore g1(), ou sera-il être à la sortie destructed de h()?

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

Pas de prolongation de la vie pour votre deuxième extrait. – Jarod42

+1

** Si ** était 'std :: avant ' puis une construction de mouvement peut-on attendre. Mais dans votre deuxième extrait, ** depuis ** est un 'std :: avant ', il évite ainsi toute construction et laisse une référence boiteuse –

+0

'Non lorsque g' retourne le est détruit local temporaire et il vous reste un référence pendante. Aussi, je pensais que l'extension de référence n'était que pour ref ref pas rvalue ref - ai-je manqué quelque chose, cela a-t-il changé en C++ 1z? –

Répondre

5

Que diriez-vous de retourner cette référence? Est-ce que l'objet vit encore dans g1()

Non L'extension de durée de vie est quelque chose qui arrive une seule fois. Le retour de temporaire f() est lié à la référence ro1 et sa durée de vie est prolongée pour la durée de vie de cette référence. durée de vie de l » ro1 se termine à la fin de h(), de sorte que toute utilisation de ro2 dans g1() est une référence pendantes.

Pour que cela fonctionne, vous devez traiter avec des valeurs:

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

Notez que RVO est toujours valable ici.