2017-06-09 7 views
3

Est-ce que l'utilisation suivante de p dans main est sûre? Je crois que la liaison temporaire produite par mk_pair a sa durée de vie étendue à celle de p, mais qu'en est-il des objets temporaires créés par Wrap{1} et Wrap{2}?Durée de vie d'une temporaire avec des sous-expressions temporaires, liée à une référence

struct Wrap { int &&x; }; 

struct Pair { Wrap &&w1, &&w2; }; 

Pair mk_pair(Wrap &&w1, Wrap &&w2) { return Pair{std::move(w1),std::move(w2)}; } 

int main(int argc, char *argv[]) 
{ 
    Pair &&p = mk_pair(Wrap{1},Wrap{2}); 
    std::cout << p.w1.x << ' ' << p.w2.x << '\n'; 
    return 0; 
} 

Répondre

4

n ° Wrap{1} et Wrap{2} ne sont pas liés à des références automatiques main, ils sont détruits à la fin de la ligne.

Le Pair renvoyé de mk_pair a sa durée de vie étendue à celle de p, mais ses références sont suspendues.

2

Ce comportement n'est pas défini. Dans

mk_pair(Wrap &&w1, Wrap &&w2) 

vous prenez w1 et w2 comme références rvalue, ce qui est correct, vous prolongez la vie dans la fonction. Ensuite, vous renvoyez un objet qui fait référence à ces références. Le problème avec cela est lorsque l'expression se termine, les temporaires que vous avez passés par référence, sont détruits. Cela signifie que vous connaissez des références pour faire référence à des objets expirés et que l'utilisation de ces comportements n'est pas définie.